chenrui
2025-05-20 487b30b77565d9b12f203a1234a93b80a8c59177
回款台账
已修改5个文件
已添加4个文件
313 ■■■■■ 文件已修改
src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationProductRecordMapper.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationRecordMapper.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/InvoiceRegistrationProductRecord.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/InvoiceRegistrationRecord.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java 79 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/InvoiceRegistrationMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationDto.java
@@ -23,4 +23,7 @@
    @ApiModelProperty(name = "合同金额")
    private BigDecimal contractAmount;
    @ApiModelProperty(name = "未开票金额")
    private BigDecimal noInvoiceAmountTotal;
}
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> {
}
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> {
}
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;
}
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 = "销售台账sales_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;
}
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;
}
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);
            // æ–°å¢žå¼€ç¥¨äº§å“ç™»è®°
        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 {
        }
        // ä¿å­˜æœ¬æ¬¡å¼€ç¥¨ç™»è®°è®°å½•
        InvoiceRegistrationRecord invoiceRegistrationRecord = new InvoiceRegistrationRecord();
        BeanUtils.copyProperties(invoiceRegistrationDto, invoiceRegistrationRecord);
        invoiceRegistrationRecordMapper.insert(invoiceRegistrationRecord);
            if(CollectionUtils.isNotEmpty(productDtoList)){
                for (InvoiceRegistrationProductDto invoiceRegistrationProductDto : productDtoList) {
                    InvoiceRegistrationProduct invoiceRegistrationProduct = new InvoiceRegistrationProduct();
                    BeanUtils.copyProperties(invoiceRegistrationProductDto, invoiceRegistrationProduct);
                    invoiceRegistrationProductMapper.updateById(invoiceRegistrationProduct);
                }
                InvoiceRegistrationProductRecord invoiceRegistrationProductRecord = new InvoiceRegistrationProductRecord();
                BeanUtils.copyProperties(invoiceRegistrationProductDto, invoiceRegistrationProductRecord);
                invoiceRegistrationProductRecord.setInvoiceRegistrationRecordId(invoiceRegistrationRecord.getId());
                invoiceRegistrationProductRecord.setSalesLedgerProductId(invoiceRegistrationProductDto.getId());
                invoiceRegistrationProductRecord.setId(null);
                invoiceRegistrationProductRecordMapper.insert(invoiceRegistrationProductRecord);
            }
        }
    }
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());
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">