From 487b30b77565d9b12f203a1234a93b80a8c59177 Mon Sep 17 00:00:00 2001 From: chenrui <1187576398@qq.com> Date: 星期二, 20 五月 2025 13:58:00 +0800 Subject: [PATCH] 回款台账 --- src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationProductRecordMapper.java | 13 ++ src/main/java/com/ruoyi/sales/pojo/InvoiceRegistrationRecord.java | 53 ++++++++ src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java | 85 +++++++++++-- src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java | 17 ++ src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | 33 +++++ src/main/resources/mapper/sales/InvoiceRegistrationMapper.xml | 12 + src/main/java/com/ruoyi/sales/pojo/InvoiceRegistrationProductRecord.java | 87 ++++++++++++++ src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationDto.java | 3 src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationRecordMapper.java | 16 ++ 9 files changed, 299 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationDto.java b/src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationDto.java index 235a534..05e8509 100644 --- a/src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationDto.java +++ b/src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationDto.java @@ -23,4 +23,7 @@ @ApiModelProperty(name = "鍚堝悓閲戦") private BigDecimal contractAmount; + @ApiModelProperty(name = "鏈紑绁ㄩ噾棰�") + private BigDecimal noInvoiceAmountTotal; + } diff --git a/src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationProductRecordMapper.java b/src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationProductRecordMapper.java new file mode 100644 index 0000000..89652ec --- /dev/null +++ b/src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationProductRecordMapper.java @@ -0,0 +1,13 @@ +package com.ruoyi.sales.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ruoyi.sales.dto.InvoiceRegistrationProductDto; +import com.ruoyi.sales.pojo.InvoiceRegistrationProduct; +import com.ruoyi.sales.pojo.InvoiceRegistrationProductRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface InvoiceRegistrationProductRecordMapper extends BaseMapper<InvoiceRegistrationProductRecord> { + +} diff --git a/src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationRecordMapper.java b/src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationRecordMapper.java new file mode 100644 index 0000000..6b14609 --- /dev/null +++ b/src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationRecordMapper.java @@ -0,0 +1,16 @@ +package com.ruoyi.sales.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.sales.dto.InvoiceRegistrationDto; +import com.ruoyi.sales.excel.InvoiceRegisAndProductExcelDto; +import com.ruoyi.sales.pojo.InvoiceRegistration; +import com.ruoyi.sales.pojo.InvoiceRegistrationRecord; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +public interface InvoiceRegistrationRecordMapper extends BaseMapper<InvoiceRegistrationRecord> { + +} diff --git a/src/main/java/com/ruoyi/sales/pojo/InvoiceRegistrationProductRecord.java b/src/main/java/com/ruoyi/sales/pojo/InvoiceRegistrationProductRecord.java new file mode 100644 index 0000000..e34f56e --- /dev/null +++ b/src/main/java/com/ruoyi/sales/pojo/InvoiceRegistrationProductRecord.java @@ -0,0 +1,87 @@ +package com.ruoyi.sales.pojo; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@TableName("invoice_registration_product_record") +@Data +public class InvoiceRegistrationProductRecord { + + /** + * 搴忓彿 + */ + @TableId(type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "鍏宠仈閿�鍞彴璐︿富琛ㄤ富閿�") + private Integer salesLedgerId; + + @ApiModelProperty(value = "sales_ledger_product涓婚敭") + private Integer salesLedgerProductId; + + @ApiModelProperty(value = "寮�绁ㄧ櫥璁拌〃invoice_registration_record涓婚敭") + private Integer invoiceRegistrationRecordId; + + @ApiModelProperty(value = "浜у搧澶х被") + private String productCategory; + + @ApiModelProperty(value = "瑙勬牸鍨嬪彿") + private String specificationModel; + + @ApiModelProperty(value = "鍗曚綅") + private String unit; + + @ApiModelProperty(value = "鏁伴噺") + private BigDecimal quantity; + + @ApiModelProperty(value = "绋庣巼") + private BigDecimal taxRate; + + @ApiModelProperty(value = "鍚◣鍗曚环") + private BigDecimal taxInclusiveUnitPrice; + + @ApiModelProperty(value = "鍚◣鎬讳环") + private BigDecimal taxInclusiveTotalPrice; + + @ApiModelProperty(value = "涓嶅惈绋庢�讳环") + private BigDecimal taxExclusiveTotalPrice; + + @ApiModelProperty(value = "鍙戠エ绫诲瀷") + private String invoiceType; + + @ApiModelProperty(value = "寮�绁ㄦ暟") + private Integer invoiceNum; + + @ApiModelProperty(value = "鏈紑绁ㄦ暟") + private Integer noInvoiceNum; + + @ApiModelProperty(value = "寮�绁ㄩ噾棰�") + private BigDecimal invoiceAmount; + + @ApiModelProperty(value = "鏈紑绁ㄩ噾棰�") + private BigDecimal noInvoiceAmount; + + @ApiModelProperty(value = "鍒涘缓鏃堕棿") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛") + @TableField(fill = FieldFill.INSERT) + private Integer createUser; + + @ApiModelProperty(value = "淇敼鏃堕棿") + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + @ApiModelProperty(value = "淇敼鐢ㄦ埛") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Integer updateUser; + + @ApiModelProperty(value = "绉熸埛ID") + @TableField(fill = FieldFill.INSERT) + private Integer tenantId; +} diff --git a/src/main/java/com/ruoyi/sales/pojo/InvoiceRegistrationRecord.java b/src/main/java/com/ruoyi/sales/pojo/InvoiceRegistrationRecord.java new file mode 100644 index 0000000..695d426 --- /dev/null +++ b/src/main/java/com/ruoyi/sales/pojo/InvoiceRegistrationRecord.java @@ -0,0 +1,53 @@ +package com.ruoyi.sales.pojo; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@TableName("invoice_registration_record") +public class InvoiceRegistrationRecord { + + /** + * 搴忓彿 + */ + @TableId(type = IdType.AUTO) + private Integer id; + + @ApiModelProperty(value = "閿�鍞彴璐ales_ledger涓婚敭") + private Integer salesLedgerId; + + @ApiModelProperty(value = "閿�鍞悎鍚屽彿") + private String salesContractNo; + + @ApiModelProperty(value = "瀹㈡埛鍚嶇ОID") + private Integer customerId; + + @ApiModelProperty(value = "涓氬姟鍛�") + private String salesman; + + @ApiModelProperty(value = "椤圭洰鍚嶇О") + private String projectName; + + @ApiModelProperty(value = "鍒涘缓鏃堕棿") + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + @ApiModelProperty(value = "鍒涘缓鐢ㄦ埛") + @TableField(fill = FieldFill.INSERT) + private Integer createUser; + + @ApiModelProperty(value = "淇敼鏃堕棿") + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + @ApiModelProperty(value = "淇敼鐢ㄦ埛") + @TableField(fill = FieldFill.INSERT_UPDATE) + private Integer updateUser; + + @ApiModelProperty(value = "绉熸埛ID") + @TableField(fill = FieldFill.INSERT) + private Integer tenantId; +} diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java index dde60d3..cfb1789 100644 --- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java +++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.ruoyi.framework.aspectj.lang.annotation.Excel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** @@ -101,12 +102,24 @@ private BigDecimal ticketsAmount; /** - * 鏈潵绁ㄦ暟 + * 鏈紑绁ㄦ暟 */ private Long futureTickets; /** - * 鏈潵绁ㄩ噾棰�(鍏�) + * 鏈紑绁ㄩ噾棰�(鍏�) */ private BigDecimal futureTicketsAmount; + + @ApiModelProperty(value = "寮�绁ㄦ暟") + private Integer invoiceNum; + + @ApiModelProperty(value = "鏈紑绁ㄦ暟") + private Integer noInvoiceNum; + + @ApiModelProperty(value = "寮�绁ㄩ噾棰�") + private BigDecimal invoiceAmount; + + @ApiModelProperty(value = "鏈紑绁ㄩ噾棰�") + private BigDecimal noInvoiceAmount; } diff --git a/src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java index 3130872..baaeee9 100644 --- a/src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java +++ b/src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java @@ -12,8 +12,12 @@ import com.ruoyi.sales.excel.InvoiceRegisAndProductExcelDto; import com.ruoyi.sales.mapper.InvoiceRegistrationMapper; import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper; +import com.ruoyi.sales.mapper.InvoiceRegistrationProductRecordMapper; +import com.ruoyi.sales.mapper.InvoiceRegistrationRecordMapper; import com.ruoyi.sales.pojo.InvoiceRegistration; import com.ruoyi.sales.pojo.InvoiceRegistrationProduct; +import com.ruoyi.sales.pojo.InvoiceRegistrationProductRecord; +import com.ruoyi.sales.pojo.InvoiceRegistrationRecord; import com.ruoyi.sales.service.InvoiceRegistrationService; import org.apache.commons.collections4.CollectionUtils; import org.springframework.beans.BeanUtils; @@ -23,6 +27,7 @@ import org.springframework.util.ObjectUtils; import javax.servlet.http.HttpServletResponse; +import java.math.BigDecimal; import java.util.List; import java.util.stream.Collectors; @@ -35,6 +40,12 @@ @Autowired private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper; + @Autowired + private InvoiceRegistrationRecordMapper invoiceRegistrationRecordMapper; + + @Autowired + private InvoiceRegistrationProductRecordMapper invoiceRegistrationProductRecordMapper; + /** * 寮�绁ㄧ櫥璁版柊澧� @@ -44,29 +55,71 @@ @Override @Transactional(rollbackFor = Exception.class) public void invoiceRegistrationSaveOrUpdate(InvoiceRegistrationDto invoiceRegistrationDto) { - InvoiceRegistration invoiceRegistration = new InvoiceRegistration(); - BeanUtils.copyProperties(invoiceRegistrationDto, invoiceRegistration); List<InvoiceRegistrationProductDto> productDtoList = invoiceRegistrationDto.getProductDtoList(); - // 鏂板寮�绁ㄧ櫥璁� - if(invoiceRegistrationDto.getId() == null){ - invoiceRegistrationMapper.insert(invoiceRegistration); - // 鏂板寮�绁ㄤ骇鍝佺櫥璁� - if(CollectionUtils.isNotEmpty(productDtoList)){ + Integer salesLedgerId = invoiceRegistrationDto.getSalesLedgerId(); + if (null == salesLedgerId){ + throw new RuntimeException("鏈叧鑱旈攢鍞悎鍚�"); + } + QueryWrapper<InvoiceRegistration> inRegWrapper = new QueryWrapper<>(); + inRegWrapper.eq("sales_ledger_id", salesLedgerId); + InvoiceRegistration invoiceRegistration = invoiceRegistrationMapper.selectOne(inRegWrapper); + Integer invoiceRegistrationId = null; + // 鍒ゆ柇鏄惁宸茬粡鍋氳繃鐧昏锛屽鏋滄湁鍚堝苟锛屽鏋滄病鏈夋柊澧� + if(ObjectUtils.isEmpty(invoiceRegistration)){ + InvoiceRegistration insertInvocieReg = new InvoiceRegistration(); + BeanUtils.copyProperties(invoiceRegistrationDto, insertInvocieReg); + invoiceRegistrationMapper.insert(insertInvocieReg); + invoiceRegistrationId = insertInvocieReg.getId(); + }else { + invoiceRegistrationId = invoiceRegistration.getId(); + } + // 鏌ヨ浜у搧鏄惁宸茬粡鐧昏 + if(CollectionUtils.isNotEmpty(productDtoList)){ + QueryWrapper<InvoiceRegistrationProduct> inRegProductWrapper = new QueryWrapper<>(); + inRegProductWrapper.eq("invoice_registration_id", invoiceRegistrationId); + List<InvoiceRegistrationProduct> invoiceRegistrationProductList = invoiceRegistrationProductMapper.selectList(inRegProductWrapper); + if(CollectionUtils.isNotEmpty(invoiceRegistrationProductList)){ + // 鎵归噺鏇存柊 + for (InvoiceRegistrationProduct invoiceRegistrationProduct : invoiceRegistrationProductList) { + for (InvoiceRegistrationProductDto invoiceRegistrationProductDto : productDtoList) { + if( null != invoiceRegistrationProductDto.getId() && null != invoiceRegistrationProduct.getSalesLedgerProductId() + && invoiceRegistrationProductDto.getId() == invoiceRegistrationProduct.getSalesLedgerProductId().longValue() ){ + // 璁$畻宸插紑绁ㄦ暟 + invoiceRegistrationProduct.setInvoiceNum(invoiceRegistrationProduct.getInvoiceNum() + invoiceRegistrationProductDto.getInvoiceNum()); + // 璁$畻宸插紑绁ㄩ噾棰� + invoiceRegistrationProduct.setInvoiceAmount(invoiceRegistrationProduct.getInvoiceAmount().add(invoiceRegistrationProductDto.getInvoiceAmount())); +// // 璁$畻鏈紑绁ㄦ暟 + invoiceRegistrationProduct.setNoInvoiceNum(invoiceRegistrationProductDto.getNoInvoiceNum()); +// // 璁$畻鏈紑绁ㄩ噾棰� 鍚◣鎬讳环-寮�绁ㄩ噾棰� + invoiceRegistrationProduct.setNoInvoiceAmount(invoiceRegistrationProductDto.getNoInvoiceAmount()); + invoiceRegistrationProductMapper.updateById(invoiceRegistrationProduct); + } + } + } + }else { + // 鎵归噺鎻掑叆 for (InvoiceRegistrationProductDto invoiceRegistrationProductDto : productDtoList) { InvoiceRegistrationProduct invoiceRegistrationProduct = new InvoiceRegistrationProduct(); BeanUtils.copyProperties(invoiceRegistrationProductDto, invoiceRegistrationProduct); - invoiceRegistrationProduct.setInvoiceRegistrationId(invoiceRegistration.getId()); + invoiceRegistrationProduct.setInvoiceRegistrationId(invoiceRegistrationId); + invoiceRegistrationProduct.setSalesLedgerProductId(invoiceRegistrationProductDto.getId()); + invoiceRegistrationProduct.setId(null); invoiceRegistrationProductMapper.insert(invoiceRegistrationProduct); } } - // 寮�绁ㄧ櫥璁颁慨鏀� - }else { - if(CollectionUtils.isNotEmpty(productDtoList)){ - for (InvoiceRegistrationProductDto invoiceRegistrationProductDto : productDtoList) { - InvoiceRegistrationProduct invoiceRegistrationProduct = new InvoiceRegistrationProduct(); - BeanUtils.copyProperties(invoiceRegistrationProductDto, invoiceRegistrationProduct); - invoiceRegistrationProductMapper.updateById(invoiceRegistrationProduct); - } + } + // 淇濆瓨鏈寮�绁ㄧ櫥璁拌褰� + InvoiceRegistrationRecord invoiceRegistrationRecord = new InvoiceRegistrationRecord(); + BeanUtils.copyProperties(invoiceRegistrationDto, invoiceRegistrationRecord); + invoiceRegistrationRecordMapper.insert(invoiceRegistrationRecord); + if(CollectionUtils.isNotEmpty(productDtoList)){ + for (InvoiceRegistrationProductDto invoiceRegistrationProductDto : productDtoList) { + InvoiceRegistrationProductRecord invoiceRegistrationProductRecord = new InvoiceRegistrationProductRecord(); + BeanUtils.copyProperties(invoiceRegistrationProductDto, invoiceRegistrationProductRecord); + invoiceRegistrationProductRecord.setInvoiceRegistrationRecordId(invoiceRegistrationRecord.getId()); + invoiceRegistrationProductRecord.setSalesLedgerProductId(invoiceRegistrationProductDto.getId()); + invoiceRegistrationProductRecord.setId(null); + invoiceRegistrationProductRecordMapper.insert(invoiceRegistrationProductRecord); } } } diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java index 557b898..9163f8b 100644 --- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java +++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java @@ -1,6 +1,7 @@ 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.mapper.BaseMapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -13,9 +14,11 @@ import com.ruoyi.other.pojo.TempFile; import com.ruoyi.sales.dto.SalesLedgerDto; import com.ruoyi.sales.mapper.CommonFileMapper; +import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper; import com.ruoyi.sales.mapper.SalesLedgerMapper; import com.ruoyi.sales.mapper.SalesLedgerProductMapper; import com.ruoyi.sales.pojo.CommonFile; +import com.ruoyi.sales.pojo.InvoiceRegistrationProduct; import com.ruoyi.sales.pojo.SalesLedger; import com.ruoyi.sales.pojo.SalesLedgerProduct; import com.ruoyi.sales.service.ISalesLedgerService; @@ -23,11 +26,13 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FilenameUtils; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.script.DefaultRedisScript; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; import java.io.IOException; import java.lang.reflect.Field; @@ -66,6 +71,9 @@ private final TempFileMapper tempFileMapper; + @Autowired + private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper; + @Value("${file.upload-dir}") private String uploadDir; @@ -95,6 +103,30 @@ LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>(); productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId()); List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper); + // 鏌ヨ鏈紑绁ㄩ噾棰�/鏈紑绁ㄦ暟 + if (CollectionUtils.isNotEmpty(products)) { + QueryWrapper<InvoiceRegistrationProduct> productQueryWrapper = new QueryWrapper<>(); + List<Long> productIds = products.stream().map(SalesLedgerProduct::getId).collect(Collectors.toList()); + productQueryWrapper.in("sales_ledger_product_id", productIds); + List<InvoiceRegistrationProduct> invoiceRegistrationProductList = invoiceRegistrationProductMapper.selectList(productQueryWrapper); + if(CollectionUtils.isNotEmpty(invoiceRegistrationProductList)){ + for (SalesLedgerProduct product : products) { + for (InvoiceRegistrationProduct invoiceRegistrationProduct : invoiceRegistrationProductList) { + Integer salesLedgerProductId = invoiceRegistrationProduct.getSalesLedgerProductId(); + Long id = product.getId(); + if( null != id && null != salesLedgerProductId && id == salesLedgerProductId.longValue()){ + product.setFutureTickets(Long.valueOf(invoiceRegistrationProduct.getNoInvoiceNum())); + product.setFutureTicketsAmount(invoiceRegistrationProduct.getNoInvoiceAmount()); + } + } + } + }else { + for (SalesLedgerProduct product : products) { + product.setFutureTickets(product.getQuantity().longValue()); + product.setFutureTicketsAmount(product.getTaxInclusiveTotalPrice()); + } + } + } // 3.鏌ヨ涓婁紶鏂囦欢 LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>(); @@ -237,7 +269,6 @@ if (salesLedgerDto.getTempFileIds() != null && !salesLedgerDto.getTempFileIds().isEmpty()) { migrateTempFilesToFormal(salesLedger.getId(), salesLedgerDto.getTempFileIds()); } - return 1; } catch (IOException e) { throw new BaseException("鏂囦欢杩佺Щ澶辫触: " + e.getMessage()); diff --git a/src/main/resources/mapper/sales/InvoiceRegistrationMapper.xml b/src/main/resources/mapper/sales/InvoiceRegistrationMapper.xml index 45f6109..9edbea4 100644 --- a/src/main/resources/mapper/sales/InvoiceRegistrationMapper.xml +++ b/src/main/resources/mapper/sales/InvoiceRegistrationMapper.xml @@ -18,10 +18,20 @@ T1.tenant_id, T2.customer_contract_no, T3.customer_name, - T2.contract_amount + T2.contract_amount, + CASE WHEN T4.noInvoiceAmountTotal IS NULL THEN 0 ELSE T4.noInvoiceAmountTotal END AS noInvoiceAmountTotal FROM invoice_registration T1 LEFT JOIN sales_ledger T2 ON T1.sales_ledger_id = T2.id LEFT JOIN customer T3 ON T1.customer_id = T3.id + LEFT JOIN ( + SELECT + SUM( no_invoice_amount ) AS noInvoiceAmountTotal , + invoice_registration_id + FROM + invoice_registration_product + GROUP BY + invoice_registration_id + ) T4 ON T1.id = T4.invoice_registration_id </select> <select id="invoiceRegisAndProductExcelDtoList" resultType="com.ruoyi.sales.excel.InvoiceRegisAndProductExcelDto"> -- Gitblit v1.9.3