chenrui
6 天以前 d1903c17568e1c373ca37a8baddbefbc330d12bf
开票台账功能修改
已修改18个文件
170 ■■■■■ 文件已修改
src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysUserController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/ISysDeptService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/impl/SysDeptServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/InvoiceLedgerDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/InvoiceLedgerMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/InvoiceLedgerMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/ReceiptPaymentMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysDeptMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysUserMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/config/IgnoreTableConfig.java
@@ -29,7 +29,6 @@
        IGNORE_TABLES.add("sales_ledger_file");
        IGNORE_TABLES.add("temp_file");
        IGNORE_TABLES.add("common_file");
        IGNORE_TABLES.add("DepartmentHierarchy");
    }
}
src/main/java/com/ruoyi/project/system/controller/SysUserController.java
@@ -140,6 +140,11 @@
        }
        user.setCreateBy(getUsername());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        // 查询顶层部门父id做为租户tenant_id
        Long tenantId = deptService.maxLevelDeptId(user.getDeptId());
        if(tenantId != null){
            user.setTenantId(tenantId.intValue());
        }
        return toAjax(userService.insertUser(user));
    }
src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java
@@ -115,4 +115,11 @@
     * @return 结果
     */
    public int deleteDeptById(Long deptId);
    /**
     * 查询顶层部门id
     * @param deptId
     * @return
     */
    Long maxLevelDeptId(Long deptId);
}
src/main/java/com/ruoyi/project/system/service/ISysDeptService.java
@@ -121,4 +121,11 @@
     * @return 结果
     */
    public int deleteDeptById(Long deptId);
    /**
     * 查询顶层部门id
     * @param deptId
     * @return
     */
    Long maxLevelDeptId(Long deptId);
}
src/main/java/com/ruoyi/project/system/service/impl/SysDeptServiceImpl.java
@@ -294,6 +294,16 @@
    }
    /**
     * 查询顶层部门id
     * @param deptId
     * @return
     */
    @Override
    public Long maxLevelDeptId(Long deptId) {
        return deptMapper.maxLevelDeptId(deptId);
    }
    /**
     * 递归列表
     */
    private void recursionFn(List<SysDept> list, SysDept t)
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -6,16 +6,21 @@
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.InvoiceLedgerDto;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.mapper.InvoiceLedgerMapper;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.service.ICommonFileService;
import com.ruoyi.sales.service.ISalesLedgerService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 销售台账Controller
@@ -32,6 +37,9 @@
    private ICommonFileService commonFileService;
    @Autowired
    private InvoiceLedgerMapper invoiceLedgerMapper;
    /**
     * 查询销售台账列表
     */
@@ -39,6 +47,23 @@
    public TableDataInfo list(SalesLedgerDto salesLedgerDto) {
        startPage();
        List<SalesLedger> list = salesLedgerService.selectSalesLedgerList(salesLedgerDto);
        // 计算已开票金额/未开票金额(已填写发票金额为准)
        if(CollectionUtils.isEmpty(list)){
            return getDataTable(list);
        }
        List<Long> salesLedgerIds = list.stream().map(SalesLedger::getId).collect(Collectors.toList());
        List<InvoiceLedgerDto> invoiceLedgerDtoList = invoiceLedgerMapper.invoicedTotal(salesLedgerIds);
        if(CollectionUtils.isEmpty(invoiceLedgerDtoList)){
            return getDataTable(list);
        }
        for (SalesLedger salesLedger : list) {
            for (InvoiceLedgerDto invoiceLedgerDto : invoiceLedgerDtoList) {
                if (salesLedger.getId().intValue() == invoiceLedgerDto.getSalesLedgerId()) {
                    BigDecimal noInvoiceAmountTotal = salesLedger.getContractAmount().subtract(invoiceLedgerDto.getInvoiceTotal());
                    salesLedger.setNoInvoiceAmountTotal(noInvoiceAmountTotal);
                }
            }
        }
        return getDataTable(list);
    }
src/main/java/com/ruoyi/sales/dto/InvoiceLedgerDto.java
@@ -39,4 +39,7 @@
    @ApiModelProperty(value = "销售合同号")
    private String salesContractNo;
    @ApiModelProperty(value = "销售合同ID")
    private Integer salesLedgerId;
}
src/main/java/com/ruoyi/sales/mapper/InvoiceLedgerMapper.java
@@ -50,4 +50,11 @@
     */
    InvoiceRegistrationProductDto invoiceLedgerProductInfo(Integer id);
    /**
     * 根据销售合同计算已开票金额
     * @param salesLedgerIds
     * @return
     */
    List<InvoiceLedgerDto> invoicedTotal(List<Long> salesLedgerIds);
}
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
@@ -93,5 +94,9 @@
     */
    @Excel(name = "合同金额")
    private BigDecimal contractAmount;
    @TableField(exist = false)
    @ApiModelProperty(value = "未开票金额(元)")
    private BigDecimal noInvoiceAmountTotal;
}
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -141,4 +141,8 @@
     * 产品规格id
     */
    private Long productModelId;
    @ApiModelProperty(value = "初始未开票数")
    @TableField(exist = false)
    private Integer originalNoInvoiceNum;
}
src/main/java/com/ruoyi/sales/service/impl/InvoiceLedgerServiceImpl.java
@@ -210,11 +210,17 @@
        if(CollectionUtils.isEmpty(invoiceLedgerDto.getFileList())){
            throw new RuntimeException("缺少文件信息");
        }
        QueryWrapper<InvoiceLedger> ledgerQueryWrapper = new QueryWrapper<>();
        ledgerQueryWrapper.eq("invoice_registration_product_id", invoiceLedgerDto.getId());
        InvoiceLedger invoiceLedger = invoiceLedgerMapper.selectOne(ledgerQueryWrapper);
        if(ObjectUtils.isEmpty(invoiceLedger)){
            throw new RuntimeException("开票台账未登记");
        }
        List<FileVo> fileList = invoiceLedgerDto.getFileList();
        fileList.forEach(fileVo -> {
            InvoiceLedgerFile invoiceLedgerFile = new InvoiceLedgerFile();
            BeanUtils.copyProperties(fileVo, invoiceLedgerFile);
            invoiceLedgerFile.setInvoiceLedgerId(invoiceLedgerDto.getId());
            invoiceLedgerFile.setInvoiceLedgerId(invoiceLedger.getId());
            invoiceLedgerFileMapper.insert(invoiceLedgerFile);
        });
    }
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -1,25 +1,28 @@
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.extension.service.impl.ServiceImpl;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.service.ISalesLedgerProductService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -39,6 +42,9 @@
    private PurchaseLedgerMapper purchaseLedgerMapper;
    @Autowired
    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    @Override
    public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
        return salesLedgerProductMapper.selectById(id);
@@ -49,7 +55,29 @@
        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId())
                .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
        return salesLedgerProductMapper.selectList(queryWrapper);
        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(queryWrapper);
        if(!CollectionUtils.isEmpty(salesLedgerProducts)){
            InvoiceRegistrationProductDto invoiceRegistrationProductDto = new InvoiceRegistrationProductDto();
            invoiceRegistrationProductDto.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId().intValue());
            List<InvoiceRegistrationProductDto> invoiceRegistrationProductDtoList = invoiceRegistrationProductMapper.invoiceRegistrationProductList(invoiceRegistrationProductDto);
            // 统计开票登记产品的已开票数/已开票金额
            if(!CollectionUtils.isEmpty(invoiceRegistrationProductDtoList)){
                for (SalesLedgerProduct ledgerProduct : salesLedgerProducts) {
                    int invoiceNum = 0;
                    BigDecimal invoiceAmount = BigDecimal.ZERO;
                    for (InvoiceRegistrationProductDto registrationProductDto : invoiceRegistrationProductDtoList) {
                        if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){
                            invoiceNum += registrationProductDto.getInvoiceNum();
                            invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount());
                        }
                    }
                    ledgerProduct.setInvoiceNum(invoiceNum);
                    ledgerProduct.setInvoiceAmount(invoiceAmount);
                }
            }
        }
        return salesLedgerProducts;
    }
    @Override
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -100,6 +100,9 @@
        LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
        productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId());
        List<SalesLedgerProduct> products = salesLedgerProductMapper.selectList(productWrapper);
        for (SalesLedgerProduct product : products) {
            product.setOriginalNoInvoiceNum(product.getNoInvoiceNum());
        }
        // 3.查询上传文件
        LambdaQueryWrapper<CommonFile> salesLedgerFileWrapper = new LambdaQueryWrapper<>();
src/main/resources/mapper/sales/InvoiceLedgerMapper.xml
@@ -167,5 +167,22 @@
        WHERE T1.id = #{id}
    </select>
    <select id="invoicedTotal" resultType="com.ruoyi.sales.dto.InvoiceLedgerDto">
        SELECT
            IFNULL(SUM(T1.invoice_total),0) AS invoice_total,
            T2.sales_ledger_id
        FROM
            invoice_ledger T1
                LEFT JOIN invoice_registration_product T2 ON T1.invoice_registration_product_id = T2.id
        <where>
            AND T2.sales_ledger_id IN
            <foreach collection="salesLedgerIds" item="item" open="(" close=")" separator=",">
                #{item}
            </foreach>
        </where>
        GROUP BY
            T2.sales_ledger_id
    </select>
</mapper>
src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml
@@ -33,6 +33,9 @@
            <if test="invoiceRegistrationProductDto.invoiceRegistrationId != null">
                invoice_registration_id = #{invoiceRegistrationProductDto.invoiceRegistrationId}
            </if>
            <if test="invoiceRegistrationProductDto.salesLedgerId != null">
                sales_ledger_id = #{invoiceRegistrationProductDto.salesLedgerId}
            </if>
        </where>
    </select>
src/main/resources/mapper/sales/ReceiptPaymentMapper.xml
@@ -29,7 +29,7 @@
                AND T4.customer_id = #{receiptPaymentDto.customerId}
            </if>
        </where>
        ORDER BY T1.receipt_payment_date ASC
        ORDER BY T1.create_time ASC
    </select>
    <select id="receiptPaymentInfo" resultType="com.ruoyi.sales.dto.ReceiptPaymentDto">
@@ -138,7 +138,7 @@
                    T4.customer_id = #{customerId}
                ORDER BY
                    T1.receipt_payment_date ASC
                    T1.create_time ASC
                    LIMIT #{total} ) AS limited_rows
    </select>
src/main/resources/mapper/system/SysDeptMapper.xml
@@ -156,4 +156,23 @@
        update sys_dept set del_flag = '2' where dept_id = #{deptId}
    </delete>
    <select id="maxLevelDeptId">
        WITH RECURSIVE DepartmentHierarchy AS (
            SELECT dept_id, parent_id
            FROM sys_dept
            WHERE dept_id = #{deptId}
            UNION ALL
            -- 递归情况:加入当前部门的父级部门
            SELECT d.dept_id, d.parent_id
            FROM sys_dept d
                     INNER JOIN DepartmentHierarchy dh ON d.dept_id = dh.parent_id
        )
        -- 查询最顶级的父级部门ID
        SELECT dept_id as top_level_department_id
        FROM DepartmentHierarchy
        WHERE parent_id = 100;
    </select>
</mapper> 
src/main/resources/mapper/system/SysUserMapper.xml
@@ -157,6 +157,7 @@
             <if test="status != null and status != ''">status,</if>
             <if test="createBy != null and createBy != ''">create_by,</if>
             <if test="remark != null and remark != ''">remark,</if>
            <if test="tenantId != null ">tenant_id,</if>
             create_time
         )values(
             <if test="userId != null and userId != ''">#{userId},</if>
@@ -171,6 +172,7 @@
             <if test="status != null and status != ''">#{status},</if>
             <if test="createBy != null and createBy != ''">#{createBy},</if>
             <if test="remark != null and remark != ''">#{remark},</if>
            <if test="tenantId != null ">#{tenantId},</if>
             sysdate()
         )
    </insert>