src/main/java/com/ruoyi/common/vo/FileVo.java
@@ -9,10 +9,10 @@ public class FileVo { @ApiModelProperty(value = "æä»¶åç§°") private String fileName; private String name; @ApiModelProperty(value = "æä»¶è·¯å¾") private String filePath; private String url; @ApiModelProperty(value = "æä»¶å¤§å°") private int fileSize; @@ -28,4 +28,6 @@ @ApiModelProperty(value = "ä¿®æ¹ç¨æ·") private Integer updateUser; private Integer id; } src/main/java/com/ruoyi/other/pojo/TempFile.java
@@ -1,5 +1,6 @@ package com.ruoyi.other.pojo; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @@ -8,6 +9,9 @@ @Data @TableName("temp_file") public class TempFile { private static final long serialVersionUID = 1L; @TableId private String tempId; // ä¸´æ¶æä»¶IDï¼UUIDï¼ private String originalName; // åå§æä»¶å private String tempPath; // 临æ¶åå¨è·¯å¾ src/main/java/com/ruoyi/purchase/controller/PurchaseLedgerController.java
@@ -3,8 +3,10 @@ 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; @@ -18,19 +20,23 @@ import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.framework.web.page.TableDataInfo; import java.io.IOException; import java.util.List; import java.util.Map; /** * éè´å°è´¦Controller * * * @author ruoyi * @date 2025-05-09 */ @RestController @RequestMapping("/system/ledger") @RequestMapping("/purchase/ledger") @AllArgsConstructor public class PurchaseLedgerController extends BaseController { private IPurchaseLedgerService purchaseLedgerService; private ISalesLedgerService salesLedgerService; /** * æ¥è¯¢éè´å°è´¦å表 @@ -57,17 +63,33 @@ * æ°å¢ä¿®æ¹éè´å°è´¦ */ @Log(title = "éè´å°è´¦", businessType = BusinessType.INSERT) @PostMapping ("/addOrEditPurchase") public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedger purchaseLedger) { return toAjax(purchaseLedgerService.addOrEditPurchase(purchaseLedger)); @PostMapping("/addOrEditPurchase") public AjaxResult addOrEditPurchase(@RequestBody PurchaseLedgerDto purchaseLedgerDto) throws IOException { return toAjax(purchaseLedgerService.addOrEditPurchase(purchaseLedgerDto)); } /** * æ¥è¯¢éå®å°è´¦å产åç¶åå表 */ @GetMapping("/getPurchaseById") public PurchaseLedgerDto getPurchaseById(PurchaseLedgerDto purchaseLedgerDto) { return purchaseLedgerService.getPurchaseById(purchaseLedgerDto); } /** * å é¤éè´å°è´¦ */ @Log(title = "éè´å°è´¦", businessType = BusinessType.DELETE) @DeleteMapping("/delPurchase") @DeleteMapping("/delPurchase") public AjaxResult remove(@RequestBody Long[] ids) { return toAjax(purchaseLedgerService.deletePurchaseLedgerByIds(ids)); } /** * æ¥è¯¢éå®ååå· */ @GetMapping("/getSalesNo") public List getSalesNo() { return salesLedgerService.getSalesNo(); } } src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,90 @@ package com.ruoyi.purchase.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.sales.pojo.SalesLedgerFile; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.Data; import java.util.Date; import java.util.List; @Data public class PurchaseLedgerDto { private Long id; /** * éè´ååå· */ private String purchaseContractNumber; /** * ä¾åºååç§° */ private String supplierName; /** * å½å ¥äººå§åid */ private Long recorderId; /** * å½å ¥äººå§å */ private String recorderName; /** * éå®ååå· */ private String salesContractNo; /** * 项ç®åç§° */ private String projectName; /** * å½å ¥æ¥æ */ @JsonFormat(pattern = "yyyy-MM-dd") private Date entryDate; /** * 夿³¨ */ private String remarks; /** * éä»¶ææè·¯å¾æåç§° */ private String attachmentMaterials; /** * è®°å½å建æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd") private Date createdAt; /** * è®°å½æåæ´æ°æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd") private Date updatedAt; /** * å ³èéå®å°è´¦ä¸»è¡¨ä¸»é® */ private Long salesLedgerId; private Boolean hasChildren = false; private Integer Type; private List<SalesLedgerProduct> productData; private List<String> tempFileIds; private List<SalesLedgerFile> SalesLedgerFiles; } src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -1,11 +1,10 @@ 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.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.framework.aspectj.lang.annotation.Excel; import lombok.Data; @@ -37,6 +36,11 @@ */ @Excel(name = "ä¾åºååç§°") private String supplierName; /** * å½å ¥äººå§åid */ private Long recorderId; /** * å½å ¥äººå§å @@ -94,4 +98,12 @@ */ private Long salesLedgerId; @TableField(fill = FieldFill.INSERT) private Long tenantId; /** * ååéé¢ï¼äº§åå«ç¨æ»ä»·ï¼ */ private BigDecimal contractAmount; } src/main/java/com/ruoyi/purchase/service/IPurchaseLedgerService.java
@@ -2,8 +2,10 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.purchase.dto.PurchaseLedgerDto; import com.ruoyi.purchase.pojo.PurchaseLedger; import java.io.IOException; import java.util.List; /** @@ -16,8 +18,9 @@ List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger); int addOrEditPurchase(PurchaseLedger purchaseLedger); int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws IOException; int deletePurchaseLedgerByIds(Long[] ids); PurchaseLedgerDto getPurchaseById(PurchaseLedgerDto purchaseLedgerDto); } src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -1,15 +1,44 @@ package com.ruoyi.purchase.service.impl; 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.exception.base.BaseException; import com.ruoyi.common.utils.StringUtils; 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.PurchaseLedgerDto; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.purchase.service.IPurchaseLedgerService; import lombok.AllArgsConstructor; import com.ruoyi.sales.mapper.SalesLedgerFileMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; 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; import org.apache.commons.io.FilenameUtils; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; 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.Arrays; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; /** * éè´å°è´¦Serviceä¸å¡å±å¤ç @@ -18,10 +47,23 @@ * @date 2025-05-09 */ @Service @AllArgsConstructor @RequiredArgsConstructor @Slf4j public class PurchaseLedgerServiceImpl extends ServiceImpl<PurchaseLedgerMapper, PurchaseLedger> implements IPurchaseLedgerService { private PurchaseLedgerMapper purchaseLedgerMapper; private final PurchaseLedgerMapper purchaseLedgerMapper; private final SalesLedgerMapper salesLedgerMapper; private final SalesLedgerProductMapper salesLedgerProductMapper; private final SysUserMapper userMapper; private final TempFileMapper tempFileMapper; private final SalesLedgerFileMapper salesLedgerFileMapper; @Value("${file.upload-dir}") private String uploadDir; @Override public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) { @@ -29,11 +71,137 @@ } @Override public int addOrEditPurchase(PurchaseLedger purchaseLedger) { public int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws IOException { SalesLedger salesLedger = salesLedgerMapper.selectById(purchaseLedgerDto.getSalesLedgerId()); if (salesLedger == null) { throw new BaseException("éå®å°è´¦ä¸åå¨"); } SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId()); // DTO转Entity PurchaseLedger purchaseLedger = new PurchaseLedger(); BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger); purchaseLedger.setTenantId(salesLedger.getTenantId()); purchaseLedger.setSalesContractNo(salesLedger.getSalesContractNo()); purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId()); purchaseLedger.setRecorderName(sysUser.getNickName()); // 3. æ°å¢ææ´æ°ä¸»è¡¨ if (purchaseLedger.getId() == null) { return purchaseLedgerMapper.insert(purchaseLedger); purchaseLedgerMapper.insert(purchaseLedger); } else { return purchaseLedgerMapper.updateById(purchaseLedger); purchaseLedgerMapper.updateById(purchaseLedger); } // 4. å¤çåè¡¨æ°æ® List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData(); if (productList != null && !productList.isEmpty()) { handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType()); } // 5. è¿ç§»ä¸´æ¶æä»¶å°æ£å¼ç®å½ if (purchaseLedgerDto.getTempFileIds() != null && !purchaseLedgerDto.getTempFileIds().isEmpty()) { migrateTempFilesToFormal(purchaseLedger.getId(), purchaseLedgerDto.getTempFileIds()); } return 1; } private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products, Integer type) { // æIDåç»ï¼åºåæ°å¢åæ´æ°çè®°å½ Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream() .peek(p -> p.setSalesLedgerId(salesLedgerId)) .collect(Collectors.partitioningBy(p -> p.getId() != null)); List<SalesLedgerProduct> updateList = partitionedProducts.get(true); List<SalesLedgerProduct> insertList = partitionedProducts.get(false); // æ§è¡æ´æ°æä½ if (!updateList.isEmpty()) { for (SalesLedgerProduct product : updateList) { product.setType(type); salesLedgerProductMapper.updateById(product); } } // æ§è¡æå ¥æä½ if (!insertList.isEmpty()) { for (SalesLedgerProduct salesLedgerProduct : insertList) { salesLedgerProduct.setType(type); salesLedgerProductMapper.insert(salesLedgerProduct); } } } /** * å°ä¸´æ¶æä»¶è¿ç§»å°æ£å¼ç®å½ * * @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) + (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ï¼ SalesLedgerFile fileRecord = new SalesLedgerFile(); fileRecord.setLedgerId(businessId); fileRecord.setName(originalFilename); fileRecord.setUrl(formalFilePath.toString()); fileRecord.setCreateTime(LocalDateTime.now()); salesLedgerFileMapper.insert(fileRecord); // å é¤ä¸´æ¶æä»¶è®°å½ tempFileMapper.deleteById(tempFile); log.info("æä»¶è¿ç§»æå: {} -> {}", tempFile.getTempPath(), formalFilePath); } catch (IOException e) { log.error("æä»¶è¿ç§»å¤±è´¥: {}", tempFile.getTempPath(), e); // å¯éæ©åæ»äºå¡æè®°å½å¤±è´¥æä»¶ throw new IOException("æä»¶è¿ç§»å¼å¸¸", e); } } } @@ -41,4 +209,34 @@ public int deletePurchaseLedgerByIds(Long[] ids) { return purchaseLedgerMapper.deleteBatchIds(Arrays.asList(ids)); } @Override public PurchaseLedgerDto getPurchaseById(PurchaseLedgerDto purchaseLedgerDto) { // 1. æ¥è¯¢ä¸»è¡¨ PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(purchaseLedgerDto.getId()); if (purchaseLedger == null) { throw new BaseException("éè´å°è´¦ä¸åå¨"); } // 2. æ¥è¯¢å表 LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>(); productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, purchaseLedger.getId()) .eq(SalesLedgerProduct::getType, purchaseLedgerDto.getType()); List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper); // 3.æ¥è¯¢ä¸ä¼ æä»¶ LambdaQueryWrapper<SalesLedgerFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>(); salesLedgerFileWrapper.eq(SalesLedgerFile::getLedgerId, purchaseLedger.getId()); List<SalesLedgerFile> salesLedgerFiles = salesLedgerFileMapper.selectList(salesLedgerFileWrapper); // 4. è½¬æ¢ DTO PurchaseLedgerDto resultDto = new PurchaseLedgerDto(); BeanUtils.copyProperties(purchaseLedger, resultDto); if (!products.isEmpty()) { resultDto.setHasChildren(true); resultDto.setProductData(products); resultDto.setSalesLedgerFiles(salesLedgerFiles); } return resultDto; } } src/main/java/com/ruoyi/sales/controller/InvoiceLedgerController.java
@@ -1,6 +1,7 @@ package com.ruoyi.sales.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.dto.SupplierManageDto; import com.ruoyi.framework.web.domain.AjaxResult; import com.ruoyi.sales.dto.InvoiceLedgerDto; import com.ruoyi.sales.service.InvoiceLedgerService; @@ -23,9 +24,9 @@ * @param invoiceLedgerDto * @return */ @PostMapping("/add") public AjaxResult invoiceLedgerAdd(@RequestBody InvoiceLedgerDto invoiceLedgerDto) { invoiceLedgerService.invoiceLedgerAdd(invoiceLedgerDto); @PostMapping("/saveOrUpdate") public AjaxResult invoiceLedgerSaveOrUpdate(@RequestBody InvoiceLedgerDto invoiceLedgerDto) { invoiceLedgerService.invoiceLedgerSaveOrUpdate(invoiceLedgerDto); return AjaxResult.success(); } @@ -35,19 +36,8 @@ * @return */ @DeleteMapping("/del") public AjaxResult invoiceLedgerDel(@RequestParam List<Integer> ids) { public AjaxResult invoiceLedgerDel(@RequestBody List<Integer> ids) { invoiceLedgerService.invoiceLedgerDel(ids); return AjaxResult.success(); } /** * å¼ç¥¨å°è´¦ä¿®æ¹ * @param invoiceLedgerDto * @return */ @PostMapping("/update") public AjaxResult invoiceLedgerUpdate(@RequestBody InvoiceLedgerDto invoiceLedgerDto) { invoiceLedgerService.invoiceLedgerUpdate(invoiceLedgerDto); return AjaxResult.success(); } @@ -87,14 +77,38 @@ } /** * éä»¶ä¸è½½ * å¼ç¥¨å°è´¦å¯¼åº * @param response * @param invoiceLedgerDto * @return */ @GetMapping("/downloadFile") public void invoiceLedgerDownloadFile(HttpServletResponse response, InvoiceLedgerDto invoiceLedgerDto) { invoiceLedgerService.invoiceLedgerDownload(response, invoiceLedgerDto); @PostMapping("/export") public void invoiceLedgerExport(HttpServletResponse response, InvoiceLedgerDto invoiceLedgerDto) { invoiceLedgerService.invoiceLedgerExport(response, invoiceLedgerDto); } /** * å¼ç¥¨å°è´¦è¯¦æ * @param id * @return */ @GetMapping("/info") public AjaxResult invoiceLedgerInfo(Integer id) { return AjaxResult.success(invoiceLedgerService.invoiceLedgerDetail(id)); } /** * æä»¶æäº¤ * @param invoiceLedgerDto * @return */ @PostMapping("/commitFile") public AjaxResult invoiceLedgerCommitFile(@RequestBody InvoiceLedgerDto invoiceLedgerDto) { try { invoiceLedgerService.invoiceLedgerCommitFile(invoiceLedgerDto); return AjaxResult.success(); }catch (Exception e) { return AjaxResult.error(e.getMessage()); } } } src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -6,8 +6,9 @@ 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 org.springframework.beans.factory.annotation.Autowired; 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; @@ -23,9 +24,12 @@ */ @RestController @RequestMapping("/sales/ledger") @AllArgsConstructor public class SalesLedgerController extends BaseController { @Autowired private ISalesLedgerService salesLedgerService; private ISalesLedgerFileService salesLedgerFileService; /** * æ¥è¯¢éå®å°è´¦å表 @@ -87,4 +91,16 @@ List<SalesLedger> list = salesLedgerService.selectSalesLedgerList(salesLedgerDto); return AjaxResult.success(list); } /** * éå®å°è´¦éä»¶å é¤ */ @Log(title = "éå®å°è´¦éä»¶å é¤", businessType = BusinessType.DELETE) @DeleteMapping("/delLedgerFile") public AjaxResult delLedgerFile(@RequestBody Long[] ids) { if (ids == null || ids.length == 0) { return AjaxResult.error("è¯·ä¼ å ¥è¦å é¤çID"); } return toAjax(salesLedgerFileService.deleteSalesLedgerByIds(ids)); } } src/main/java/com/ruoyi/sales/dto/InvoiceLedgerDto.java
@@ -16,4 +16,13 @@ @ApiModelProperty(value = "客æ·åç§°") private String customerName; @ApiModelProperty(value = "客æ·ååå·") private String customerContractNo; @ApiModelProperty(value = "ä¸å¡å") private String salesman; @ApiModelProperty(value = "å票æä»¶å") private String invoiceFileName; } src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -1,6 +1,7 @@ package com.ruoyi.sales.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.sales.pojo.SalesLedgerFile; import com.ruoyi.sales.pojo.SalesLedgerProduct; import lombok.Data; @@ -23,6 +24,8 @@ private String attachmentMaterials; private Boolean hasChildren = false; private List<SalesLedgerProduct> productData; private List<String> tempFileIds; private List<SalesLedgerFile> SalesLedgerFiles; private Integer Type; } src/main/java/com/ruoyi/sales/excel/InvoiceLedgerExcelDto.java
@@ -11,6 +11,7 @@ import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -19,6 +20,9 @@ @Excel(name = "éå®ååå·") private String salesContractNo; @Excel(name = "") private String customerContractNo; @Excel(name = "客æ·åç§°") private String customerName; @@ -36,7 +40,10 @@ private String invoicePerson; @Excel(name = "å¼ç¥¨æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime invoiceDate; @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate invoiceDate; @Excel(name = "å票") private String invoiceFileName; } src/main/java/com/ruoyi/sales/mapper/InvoiceLedgerMapper.java
@@ -26,4 +26,11 @@ */ List<InvoiceLedgerDto> invoiceLedgerList(@Param("invoiceLedgerDto") InvoiceLedgerDto invoiceLedgerDto); /** * å¼ç¥¨å°è´¦è¯¦æ * @param id * @return */ InvoiceLedgerDto invoiceLedgerInfo(Integer id); } src/main/java/com/ruoyi/sales/mapper/SalesLedgerMapper.java
@@ -19,4 +19,6 @@ * @return åºåå·å表 */ List<Integer> selectSequencesByDate(@Param("datePart") String datePart); List getSalesNo(); } src/main/java/com/ruoyi/sales/pojo/InvoiceLedger.java
@@ -10,7 +10,6 @@ import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; import java.text.Format; import java.time.LocalDate; import java.time.LocalDateTime; @@ -45,9 +44,9 @@ private String invoicePerson; @ApiModelProperty(value = "å¼ç¥¨æ¶é´") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime invoiceDate; @JsonFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") private LocalDate invoiceDate; @ApiModelProperty(value = "å建æ¶é´") @TableField(fill = FieldFill.INSERT) src/main/java/com/ruoyi/sales/pojo/InvoiceLedgerFile.java
@@ -11,10 +11,10 @@ public class InvoiceLedgerFile { @ApiModelProperty(value = "æä»¶åç§°") private String fileName; private String name; @ApiModelProperty(value = "æä»¶è·¯å¾") private String filePath; private String url; @ApiModelProperty(value = "æä»¶å¤§å°") private int fileSize; src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -91,7 +91,7 @@ /** * ååéé¢ï¼äº§åå«ç¨æ»ä»·ï¼ */ @Excel(name = "ç¨ç") @Excel(name = "ååéé¢") private BigDecimal contractAmount; } src/main/java/com/ruoyi/sales/pojo/SalesLedgerFile.java
@@ -9,6 +9,8 @@ @TableName("sales_ledger_file") public class SalesLedgerFile { private static final long serialVersionUID = 1L; @TableId(type = IdType.AUTO) private Long id; @@ -16,10 +18,10 @@ private Long ledgerId; /** æä»¶åç§° */ private String fileName; private String name; /** æä»¶è·¯å¾ */ private String filePath; private String url; /** å建æ¶é´ */ @TableField(fill = FieldFill.INSERT) src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -84,4 +84,9 @@ */ @Excel(name = "å票类å") private String invoiceType; /** * å°è´¦ç±»å 1.éå® 2ï¼éè´ */ private Integer type; } src/main/java/com/ruoyi/sales/service/ISalesLedgerFileService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,6 @@ package com.ruoyi.sales.service; public interface ISalesLedgerFileService { int deleteSalesLedgerByIds(Long[] ids); } src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -21,4 +21,6 @@ int addOrUpdateSalesLedger(SalesLedgerDto salesLedgerDto); SalesLedgerDto getSalesLedgerWithProducts(SalesLedgerDto salesLedgerDto); List getSalesNo(); } src/main/java/com/ruoyi/sales/service/InvoiceLedgerService.java
@@ -2,9 +2,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.dto.SupplierManageDto; import com.ruoyi.common.vo.FileVo; import com.ruoyi.sales.dto.InvoiceLedgerDto; import com.ruoyi.sales.pojo.InvoiceLedger; import com.ruoyi.sales.pojo.InvoiceLedgerFile; import org.springframework.web.multipart.MultipartFile; @@ -18,7 +18,7 @@ * @param invoiceLedgerDto * @return */ int invoiceLedgerAdd( InvoiceLedgerDto invoiceLedgerDto); int invoiceLedgerSaveOrUpdate( InvoiceLedgerDto invoiceLedgerDto); /** * å¼ç¥¨å°è´¦å é¤ @@ -26,13 +26,6 @@ * @return */ int invoiceLedgerDel(List<Integer> ids); /** * å¼ç¥¨å°è´¦ä¿®æ¹ * @param invoiceLedgerDto * @return */ int invoiceLedgerUpdate(InvoiceLedgerDto invoiceLedgerDto); /** * å¼ç¥¨å°è´¦å页æ¥è¯¢ @@ -62,5 +55,19 @@ * @param invoiceLedgerDto * @return */ void invoiceLedgerDownload(HttpServletResponse response ,InvoiceLedgerDto invoiceLedgerDto); void invoiceLedgerExport(HttpServletResponse response ,InvoiceLedgerDto invoiceLedgerDto); /** * å¼ç¥¨å°è´¦è¯¦æ * @param id * @return */ InvoiceLedgerDto invoiceLedgerDetail(Integer id); /** * éä»¶æäº¤ * @param invoiceLedgerDto * @return */ void invoiceLedgerCommitFile(InvoiceLedgerDto invoiceLedgerDto); } src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java
@@ -1,14 +1,11 @@ package com.ruoyi.sales.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.basic.dto.SupplierManageDto; import com.ruoyi.basic.excel.SupplierManageExcelDto; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.utils.file.FileUploadUtils; import com.ruoyi.common.utils.file.FileUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import com.ruoyi.common.vo.FileVo; import com.ruoyi.sales.dto.InvoiceLedgerDto; @@ -24,11 +21,13 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.ObjectUtils; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; @Service @@ -50,10 +49,19 @@ */ @Override @Transactional(rollbackFor = Exception.class) public int invoiceLedgerAdd(InvoiceLedgerDto invoiceLedgerDto) { public int invoiceLedgerSaveOrUpdate(InvoiceLedgerDto invoiceLedgerDto) { InvoiceLedger invoiceLedger = new InvoiceLedger(); BeanUtils.copyProperties(invoiceLedgerDto, invoiceLedger); int result = invoiceLedgerMapper.insert(invoiceLedger); int result; if(invoiceLedgerDto.getId() == null){ result = invoiceLedgerMapper.insert(invoiceLedger); }else { result = invoiceLedgerMapper.updateById(invoiceLedger); //å 餿æéä»¶å ³è LambdaQueryWrapper<InvoiceLedgerFile> delWrapper = new LambdaQueryWrapper<>(); delWrapper.eq(InvoiceLedgerFile::getInvoiceLedgerId, invoiceLedgerDto.getId()); invoiceLedgerFileMapper.delete(delWrapper); } List<FileVo> fileList = invoiceLedgerDto.getFileList(); if(CollectionUtils.isNotEmpty(fileList)){ fileList.forEach(fileVo -> { @@ -76,34 +84,6 @@ LambdaQueryWrapper<InvoiceLedger> delWrapper = new LambdaQueryWrapper<>(); delWrapper.in(InvoiceLedger::getId, ids); return invoiceLedgerMapper.delete(delWrapper); } /** * å¼ç¥¨å°è´¦ä¿®æ¹ * @param invoiceLedgerDto * @return */ @Override @Transactional(rollbackFor = Exception.class) public int invoiceLedgerUpdate(InvoiceLedgerDto invoiceLedgerDto) { InvoiceLedger invoiceLedger = new InvoiceLedger(); BeanUtils.copyProperties(invoiceLedgerDto, invoiceLedger); int result = invoiceLedgerMapper.updateById(invoiceLedger); // å é¤å ³èéä»¶ LambdaQueryWrapper<InvoiceLedgerFile> delWrapper = new LambdaQueryWrapper<>(); delWrapper.eq(InvoiceLedgerFile::getInvoiceLedgerId, invoiceLedger.getId()); invoiceLedgerFileMapper.delete(delWrapper); // éæ°æå ¥éä»¶å ³è表 List<FileVo> fileList = invoiceLedgerDto.getFileList(); if(CollectionUtils.isNotEmpty(fileList)){ fileList.forEach(fileVo -> { InvoiceLedgerFile invoiceLedgerFile = new InvoiceLedgerFile(); BeanUtils.copyProperties(fileVo, invoiceLedgerFile); invoiceLedgerFile.setInvoiceLedgerId(invoiceLedger.getId()); invoiceLedgerFileMapper.insert(invoiceLedgerFile); }); } return result; } /** @@ -139,9 +119,14 @@ FileVo fileVo = new FileVo(); try { String baseDir = uploadFile + File.separatorChar + "invoiceLedger"; String filePath = FileUploadUtils.upload(baseDir, file); fileVo.setFileName(file.getOriginalFilename()); fileVo.setFilePath(filePath); File dirFile = new File(baseDir); if(!dirFile.exists()){ dirFile.mkdirs(); } String filePath = baseDir + File.separatorChar + UUID.randomUUID() + "_" + file.getOriginalFilename(); file.transferTo(new File(filePath)); fileVo.setName(file.getOriginalFilename()); fileVo.setUrl(filePath); fileVo.setFileSize((int)file.getSize()); }catch (Exception e){ e.printStackTrace(); @@ -157,7 +142,7 @@ * @return */ @Override public void invoiceLedgerDownload(HttpServletResponse response, InvoiceLedgerDto invoiceLedgerDto) { public void invoiceLedgerExport(HttpServletResponse response, InvoiceLedgerDto invoiceLedgerDto) { List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoiceLedgerList(invoiceLedgerDto); List<InvoiceLedgerExcelDto> invoiceLedgerExcelDtoList = invoiceLedgerDtoList.stream().map(item -> { InvoiceLedgerExcelDto invoiceLedgerExcelDto = new InvoiceLedgerExcelDto(); @@ -168,4 +153,50 @@ util.exportExcel(response, invoiceLedgerExcelDtoList, "ä¾åºå导åº"); } /** * å¼ç¥¨å°è´¦è¯¦æ * @param id * @return */ @Override public InvoiceLedgerDto invoiceLedgerDetail(Integer id) { InvoiceLedgerDto invoiceLedgerDto = invoiceLedgerMapper.invoiceLedgerInfo(id); if(ObjectUtils.isEmpty(invoiceLedgerDto)){ throw new RuntimeException("å¼ç¥¨å°è´¦æ¥æ¾å¤±è´¥"); } // æ¥è¯¢éä»¶ QueryWrapper<InvoiceLedgerFile> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("invoice_ledger_id", id); List<InvoiceLedgerFile> invoiceLedgerFileList = invoiceLedgerFileMapper.selectList(queryWrapper); List<FileVo> fileList = invoiceLedgerFileList.stream().map(item -> { FileVo fileVo = new FileVo(); BeanUtils.copyProperties(item, fileVo); return fileVo; }).collect(Collectors.toList()); invoiceLedgerDto.setFileList(fileList); return invoiceLedgerDto; } /** * éä»¶æäº¤ * @param invoiceLedgerDto * @return */ @Override public void invoiceLedgerCommitFile(InvoiceLedgerDto invoiceLedgerDto) { if(null == invoiceLedgerDto.getId()){ throw new RuntimeException("缺å°å票å°è´¦ä¸»é®"); } if(CollectionUtils.isEmpty(invoiceLedgerDto.getFileList())){ throw new RuntimeException("ç¼ºå°æä»¶ä¿¡æ¯"); } List<FileVo> fileList = invoiceLedgerDto.getFileList(); fileList.forEach(fileVo -> { InvoiceLedgerFile invoiceLedgerFile = new InvoiceLedgerFile(); BeanUtils.copyProperties(fileVo, invoiceLedgerFile); invoiceLedgerFile.setInvoiceLedgerId(invoiceLedgerDto.getId()); invoiceLedgerFileMapper.insert(invoiceLedgerFile); }); } } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerFileServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,22 @@ package com.ruoyi.sales.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.sales.mapper.SalesLedgerFileMapper; import com.ruoyi.sales.pojo.SalesLedgerFile; import com.ruoyi.sales.service.ISalesLedgerFileService; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import java.util.Arrays; @Service @AllArgsConstructor public class SalesLedgerFileServiceImpl extends ServiceImpl<SalesLedgerFileMapper, SalesLedgerFile> implements ISalesLedgerFileService { private SalesLedgerFileMapper salesLedgerFileMapper; @Override public int deleteSalesLedgerByIds(Long[] ids) { return salesLedgerFileMapper.deleteBatchIds(Arrays.asList(ids)); } } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.purchase.mapper.PurchaseLedgerMapper; import com.ruoyi.purchase.pojo.PurchaseLedger; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.SalesLedger; @@ -35,6 +37,8 @@ private SalesLedgerMapper salesLedgerMapper; private PurchaseLedgerMapper purchaseLedgerMapper; @Override public SalesLedgerProduct selectSalesLedgerProductById(Long id) { return salesLedgerProductMapper.selectById(id); @@ -43,7 +47,8 @@ @Override public List<SalesLedgerProduct> selectSalesLedgerProductList(SalesLedgerProduct salesLedgerProduct) { LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId,salesLedgerProduct.getSalesLedgerId()); queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId()) .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType()); return salesLedgerProductMapper.selectList(queryWrapper); } @@ -92,7 +97,6 @@ public int addOrUpdateSalesLedgerProduct(SalesLedgerProduct salesLedgerProduct) { int result; Long salesLedgerId = salesLedgerProduct.getSalesLedgerId(); if (salesLedgerProduct.getId() == null) { result = salesLedgerProductMapper.insert(salesLedgerProduct); } else { @@ -103,19 +107,29 @@ if (result > 0 && salesLedgerId != null) { // æ¥è¯¢è¯¥ä¸»è¡¨ä¸çææåè¡¨æ°æ® LambdaQueryWrapper<SalesLedgerProduct> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId); wrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerId) .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType()); List<SalesLedgerProduct> productList = salesLedgerProductMapper.selectList(wrapper); // è°ç¨éç¨æ¹æ³æ´æ°ä¸»è¡¨éé¢ updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, salesLedgerMapper, SalesLedger.class ); if (salesLedgerProduct.getType() == 1) { // è°ç¨éç¨æ¹æ³æ´æ°ä¸»è¡¨éé¢ updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, salesLedgerMapper, SalesLedger.class ); } else { // è°ç¨éç¨æ¹æ³æ´æ°ä¸»è¡¨éé¢ updateMainContractAmount( salesLedgerId, productList, SalesLedgerProduct::getTaxInclusiveTotalPrice, purchaseLedgerMapper, PurchaseLedger.class ); } } return result; } src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; 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.CustomerMapper; import com.ruoyi.basic.pojo.Customer; @@ -28,7 +29,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.FileNotFoundException; import java.io.IOException; import java.lang.reflect.Field; import java.math.BigDecimal; @@ -52,11 +52,11 @@ @Slf4j public class SalesLedgerServiceImpl extends ServiceImpl<SalesLedgerMapper, SalesLedger> implements ISalesLedgerService { private final SalesLedgerMapper salesLedgerMapper; private final SalesLedgerMapper salesLedgerMapper; private final CustomerMapper customerMapper; private final CustomerMapper customerMapper; private final SalesLedgerProductMapper salesLedgerProductMapper; private final SalesLedgerProductMapper salesLedgerProductMapper; private final SalesLedgerFileMapper salesLedgerFileMapper; @@ -92,14 +92,58 @@ productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId()); List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper); // 3. è½¬æ¢ DTO // 3.æ¥è¯¢ä¸ä¼ æä»¶ LambdaQueryWrapper<SalesLedgerFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>(); salesLedgerFileWrapper.eq(SalesLedgerFile::getLedgerId, salesLedger.getId()); List<SalesLedgerFile> salesLedgerFiles = salesLedgerFileMapper.selectList(salesLedgerFileWrapper); // 4. è½¬æ¢ DTO SalesLedgerDto resultDto = new SalesLedgerDto(); BeanUtils.copyProperties(salesLedger, resultDto); if (!products.isEmpty()) { resultDto.setHasChildren(true); resultDto.setProductData(products); resultDto.setSalesLedgerFiles(salesLedgerFiles); } return resultDto; } @Override public List<Map<String, Object>> getSalesNo() { LambdaQueryWrapper<SalesLedger> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.select(SalesLedger::getId, SalesLedger::getSalesContractNo); // è·ååå§æ¥è¯¢ç»æ List<Map<String, Object>> result = salesLedgerMapper.selectMaps(queryWrapper); // å°ä¸å线å½å转æ¢ä¸ºé©¼å³°å½å return result.stream().map(map -> map.entrySet().stream() .collect(Collectors.toMap( entry -> underlineToCamel(entry.getKey()), Map.Entry::getValue)) ).collect(Collectors.toList()); } /** * ä¸å线å½å转驼峰å½å */ private String underlineToCamel(String param) { if (param == null || "".equals(param.trim())) { return ""; } int len = param.length(); StringBuilder sb = new StringBuilder(len); for (int i = 0; i < len; i++) { char c = param.charAt(i); if (c == '_') { if (++i < len) { sb.append(Character.toUpperCase(param.charAt(i))); } } else { sb.append(Character.toLowerCase(c)); } } return sb.toString(); } @Override @@ -148,7 +192,7 @@ // 4. å¤çåè¡¨æ°æ® List<SalesLedgerProduct> productList = salesLedgerDto.getProductData(); if (productList != null && !productList.isEmpty()) { handleSalesLedgerProducts(salesLedger.getId(), productList); handleSalesLedgerProducts(salesLedger.getId(), productList,salesLedgerDto.getType()); updateMainContractAmount( salesLedger.getId(), productList, @@ -197,7 +241,8 @@ // æ¥è¯¢ä¸´æ¶æä»¶è®°å½ TempFile tempFile = tempFileMapper.selectById(tempFileId); if (tempFile == null) { throw new FileNotFoundException("ä¸´æ¶æä»¶ä¸åå¨: " + tempFileId); log.warn("ä¸´æ¶æä»¶ä¸åå¨ï¼è·³è¿å¤ç: {}", tempFileId); continue; } // æå»ºæ£å¼æä»¶åï¼å å«ä¸å¡IDåæ¶é´æ³ï¼é¿å å²çªï¼ @@ -223,8 +268,8 @@ // æ´æ°æä»¶è®°å½ï¼å ³èå°ä¸å¡IDï¼ SalesLedgerFile fileRecord = new SalesLedgerFile(); fileRecord.setLedgerId(businessId); fileRecord.setFileName(originalFilename); fileRecord.setFilePath(formalFilePath.toString()); fileRecord.setName(originalFilename); fileRecord.setUrl(formalFilePath.toString()); fileRecord.setCreateTime(LocalDateTime.now()); salesLedgerFileMapper.insert(fileRecord); @@ -241,7 +286,7 @@ } private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products) { private void handleSalesLedgerProducts(Long salesLedgerId, List<SalesLedgerProduct> products,Integer type) { // æIDåç»ï¼åºåæ°å¢åæ´æ°çè®°å½ Map<Boolean, List<SalesLedgerProduct>> partitionedProducts = products.stream() .peek(p -> p.setSalesLedgerId(salesLedgerId)) @@ -253,12 +298,14 @@ // æ§è¡æ´æ°æä½ if (!updateList.isEmpty()) { for (SalesLedgerProduct product : updateList) { product.setType(type); salesLedgerProductMapper.updateById(product); } } // æ§è¡æå ¥æä½ if (!insertList.isEmpty()) { for (SalesLedgerProduct salesLedgerProduct : insertList) { salesLedgerProduct.setType(type); salesLedgerProductMapper.insert(salesLedgerProduct); } } src/main/resources/mapper/sales/InvoiceLedgerMapper.xml
@@ -19,9 +19,19 @@ T1.update_time , T1.update_user , T1.tenant_id , T2.customer_name T2.customer_name, T3.customer_contract_no, T3.salesman, T4.invoiceFileName FROM invoice_ledger T1 LEFT JOIN customer T2 ON T1.customer_id = T2.id LEFT JOIN sales_ledger T3 ON T1.sales_ledger_id = T3.id LEFT JOIN ( SELECT invoice_ledger_id, GROUP_CONCAT( name ORDER BY id ASC SEPARATOR ' | ') AS invoiceFileName FROM invoice_ledger_file GROUP BY invoice_ledger_id ) T4 ON T4.invoice_ledger_id = T1.id <where> <if test="invoiceLedgerDto.searchText != null and invoiceLedgerDto.searchText != ''"> AND ( @@ -36,6 +46,48 @@ </select> <select id="invoiceLedgerList" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto"> SELECT T1.id , T1.sales_ledger_id , T1.sales_contract_no , T1.customer_id , T1.invoice_no , T1.invoice_amount , T1.tax_rate , T1.invoice_person , T1.invoice_date , T1.create_time , T1.create_user , T1.update_time , T1.update_user , T1.tenant_id , T2.customer_name, T3.salesman, T3.customer_contract_no, T4.invoiceFileName FROM invoice_ledger T1 LEFT JOIN customer T2 ON T1.customer_id = T2.id LEFT JOIN sales_ledger T3 ON T1.sales_ledger_id = T3.id LEFT JOIN ( SELECT invoice_ledger_id, GROUP_CONCAT( name ORDER BY id ASC SEPARATOR ' | ') AS invoiceFileName FROM invoice_ledger_file GROUP BY invoice_ledger_id ) T4 ON T4.invoice_ledger_id = T1.id <where> <if test="invoiceLedgerDto.searchText != null and invoiceLedgerDto.searchText != ''"> AND ( T2.customer_name LIKE CONCAT('%',#{invoiceLedgerDto.searchText},'%') OR T1.sales_contract_no LIKE CONCAT('%',#{invoiceLedgerDto.searchText},'%') ) </if> <if test="invoiceLedgerDto.invoiceDate != null"> AND DATE_FORMAT(T1.invoice_date,'%Y-%m-%d') = DATE_FORMAT(#{invoiceLedgerDto.invoiceDate},'%Y-%m-%d') </if> </where> </select> <select id="invoiceLedgerInfo" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto"> SELECT T1.id , T1.sales_ledger_id , @@ -54,16 +106,8 @@ T2.customer_name FROM invoice_ledger T1 LEFT JOIN customer T2 ON T1.customer_id = T2.id <where> <if test="invoiceLedgerDto.searchText != null and invoiceLedgerDto.searchText != ''"> AND ( T2.customer_name LIKE CONCAT('%',#{invoiceLedgerDto.searchText},'%') OR T1.sales_contract_no LIKE CONCAT('%',#{invoiceLedgerDto.searchText},'%') ) </if> <if test="invoiceLedgerDto.invoiceDate != null"> AND DATE_FORMAT(T1.invoice_date,'%Y-%m-%d') = DATE_FORMAT(#{invoiceLedgerDto.invoiceDate},'%Y-%m-%d') </if> </where> WHERE T1.id = #{id} </select> </mapper> src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -9,4 +9,7 @@ FROM sales_ledger WHERE SUBSTR(sales_contract_no, 1, 8) = #{datePart} </select> <select id="getSalesNo" resultType="com.ruoyi.sales.pojo.SalesLedger"> </select> </mapper>