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>