chenrui
2025-05-08 436d2ae994f2ab3553da7f8a2828ef80cf982eae
开票登记功能开发
已添加11个文件
495 ■■■■■ 文件已修改
src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationDto.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationProductDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationProductMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/InvoiceRegistration.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/InvoiceRegistrationProduct.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/InvoiceRegistrationService.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/InvoiceRegistrationMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.ruoyi.sales.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.sales.dto.InvoiceRegistrationDto;
import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
import com.ruoyi.sales.service.InvoiceRegistrationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/invoiceRegistration")
public class InvoiceRegistrationController {
    @Autowired
    private InvoiceRegistrationService invoiceRegistrationService;
    /**
     * å¼€ç¥¨ç™»è®°æ–°å¢ž
     * @param invoiceRegistrationDto
     * @return
     */
    @PostMapping("/add")
    public AjaxResult invoiceRegistrationAdd(@RequestBody InvoiceRegistrationDto invoiceRegistrationDto) {
        invoiceRegistrationService.invoiceRegistrationAdd(invoiceRegistrationDto);
        return AjaxResult.success();
    }
    /**
     * å¼€ç¥¨ç™»è®°åˆ é™¤
     * @param ids
     * @return
     */
    @DeleteMapping("/del")
    public AjaxResult invoiceRegistrationDel(List<Integer> ids) {
        invoiceRegistrationService.invoiceRegistrationDel(ids);
        return AjaxResult.success();
    }
    /**
     * å¼€ç¥¨è®°å½•修改
     * @param invoiceRegistrationDto
     * @return
     */
    @PostMapping("/update")
    public AjaxResult invoiceRegistrationUpdate(@RequestBody InvoiceRegistrationDto invoiceRegistrationDto) {
        invoiceRegistrationService.invoiceRegistrationUpdate(invoiceRegistrationDto);
        return AjaxResult.success();
    }
    /**
     * å¼€ç¥¨ç™»è®°åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param invoiceRegistrationDto
     * @return
     */
    @GetMapping("/listPage")
    public AjaxResult invoiceRegistrationListPage(Page page, InvoiceRegistrationDto invoiceRegistrationDto) {
        return AjaxResult.success(invoiceRegistrationService.invoiceRegistrationListPage(page, invoiceRegistrationDto));
    }
    /**
     * å¼€ç¥¨ç™»è®°äº§å“æŸ¥è¯¢
     * @param invoiceRegistrationProductDto
     * @return
     */
    @GetMapping("/productList")
    public AjaxResult invoiceRegistrationProductList(InvoiceRegistrationProductDto invoiceRegistrationProductDto) {
        return AjaxResult.success(invoiceRegistrationService.invoiceRegistrationProductList(invoiceRegistrationProductDto));
    }
}
src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
package com.ruoyi.sales.dto;
import com.ruoyi.sales.pojo.InvoiceRegistration;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class InvoiceRegistrationDto extends InvoiceRegistration {
    @ApiModelProperty(name = "开票登记产品集合")
    private List<InvoiceRegistrationProductDto> productDtoList;
}
src/main/java/com/ruoyi/sales/dto/InvoiceRegistrationProductDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.sales.dto;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
import lombok.Data;
@Data
public class InvoiceRegistrationProductDto extends InvoiceRegistrationProduct {
}
src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
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.pojo.InvoiceRegistration;
import org.apache.ibatis.annotations.Param;
public interface InvoiceRegistrationMapper extends BaseMapper<InvoiceRegistration> {
    /**
     * å¼€ç¥¨ç™»è®°åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param invoiceRegistrationDto
     * @return
     */
    IPage<InvoiceRegistrationDto> invoiceRegistrationListPage(Page page, @Param("invoiceRegistrationDto") InvoiceRegistrationDto invoiceRegistrationDto);
}
src/main/java/com/ruoyi/sales/mapper/InvoiceRegistrationProductMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
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 org.apache.ibatis.annotations.Param;
import java.util.List;
public interface InvoiceRegistrationProductMapper extends BaseMapper<InvoiceRegistrationProduct> {
    /**
     * å¼€ç¥¨ç™»è®°äº§å“æŸ¥è¯¢
     * @param invoiceRegistrationProductDto
     * @return
     */
    List<InvoiceRegistrationProductDto> invoiceRegistrationProductList(@Param("invoiceRegistrationProductDto") InvoiceRegistrationProductDto invoiceRegistrationProductDto);
}
src/main/java/com/ruoyi/sales/pojo/InvoiceRegistration.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")
public class InvoiceRegistration {
    /**
     * åºå·
     */
    @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/InvoiceRegistrationProduct.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")
@Data
public class InvoiceRegistrationProduct {
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "关联销售台账主表主键")
    private Integer salesLedgerId;
    @ApiModelProperty(value = "sales_ledger_product主键")
    private Integer salesLedgerProductId;
    @ApiModelProperty(value = "开票登记表invoice_registration主键")
    private Integer invoiceRegistrationId;
    @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/service/InvoiceRegistrationService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.ruoyi.sales.service;
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.dto.InvoiceRegistrationProductDto;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
public interface InvoiceRegistrationService {
    /**
     * å¼€ç¥¨ç™»è®°æ–°å¢ž
     * @param invoiceRegistrationDto
     * @return
     */
    void invoiceRegistrationAdd(InvoiceRegistrationDto invoiceRegistrationDto);
    /**
     * å¼€ç¥¨ç™»è®°åˆ é™¤
     * @param ids
     * @return
     */
    int invoiceRegistrationDel(List<Integer> ids);
    /**
     * å¼€ç¥¨è®°å½•修改
     * @param invoiceRegistrationDto
     * @return
     */
    void invoiceRegistrationUpdate(InvoiceRegistrationDto invoiceRegistrationDto);
    /**
     * å¼€ç¥¨ç™»è®°åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param invoiceRegistrationDto
     * @return
     */
    IPage<InvoiceRegistrationDto> invoiceRegistrationListPage(Page page, InvoiceRegistrationDto invoiceRegistrationDto);
    /**
     * å¼€ç¥¨ç™»è®°äº§å“æŸ¥è¯¢
     * @param invoiceRegistrationProductDto
     * @return
     */
    List<InvoiceRegistrationProductDto> invoiceRegistrationProductList(InvoiceRegistrationProductDto invoiceRegistrationProductDto);
}
src/main/java/com/ruoyi/sales/service/impl/InvoiceRegistrationServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,111 @@
package com.ruoyi.sales.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.sales.dto.InvoiceRegistrationDto;
import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
import com.ruoyi.sales.mapper.InvoiceRegistrationMapper;
import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
import com.ruoyi.sales.pojo.InvoiceRegistration;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
import com.ruoyi.sales.service.InvoiceRegistrationService;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Collections;
import java.util.List;
@Service
public class InvoiceRegistrationServiceImpl extends ServiceImpl<InvoiceRegistrationMapper, InvoiceRegistration> implements InvoiceRegistrationService {
    private InvoiceRegistrationMapper invoiceRegistrationMapper;
    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    /**
     * å¼€ç¥¨ç™»è®°æ–°å¢ž
     * @param invoiceRegistrationDto
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void invoiceRegistrationAdd(InvoiceRegistrationDto invoiceRegistrationDto) {
        InvoiceRegistration invoiceRegistration = new InvoiceRegistration();
        BeanUtils.copyProperties(invoiceRegistrationDto, invoiceRegistration);
        // æ–°å¢žå¼€ç¥¨ç™»è®°
        invoiceRegistrationMapper.insert(invoiceRegistration);
        List<InvoiceRegistrationProductDto> productDtoList = invoiceRegistrationDto.getProductDtoList();
        // æ–°å¢žå¼€ç¥¨äº§å“ç™»è®°
        if(CollectionUtils.isNotEmpty(productDtoList)){
            for (InvoiceRegistrationProductDto invoiceRegistrationProductDto : productDtoList) {
                InvoiceRegistrationProduct invoiceRegistrationProduct = new InvoiceRegistrationProduct();
                BeanUtils.copyProperties(invoiceRegistrationProductDto, invoiceRegistrationProduct);
                invoiceRegistrationProduct.setInvoiceRegistrationId(invoiceRegistration.getId());
                invoiceRegistrationProductMapper.insert(invoiceRegistrationProduct);
            }
        }
    }
    /**
     * å¼€ç¥¨ç™»è®°åˆ é™¤
     * @param ids
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int invoiceRegistrationDel(List<Integer> ids) {
        int excuteNum = invoiceRegistrationMapper.deleteBatchIds(ids);
        LambdaQueryWrapper<InvoiceRegistrationProduct> delWrapper = new LambdaQueryWrapper<>();
        delWrapper.in(InvoiceRegistrationProduct::getInvoiceRegistrationId, ids);
        invoiceRegistrationProductMapper.delete(delWrapper);
        return excuteNum;
    }
    /**
     * å¼€ç¥¨è®°å½•修改
     * @param invoiceRegistrationDto
     * @return
     */
    @Override
    public void invoiceRegistrationUpdate(InvoiceRegistrationDto invoiceRegistrationDto) {
        InvoiceRegistration invoiceRegistration = new InvoiceRegistration();
        BeanUtils.copyProperties(invoiceRegistrationDto, invoiceRegistration);
        // å¼€ç¥¨ç™»è®°ä¿®æ”¹
        invoiceRegistrationMapper.updateById(invoiceRegistration);
        List<InvoiceRegistrationProductDto> productDtoList = invoiceRegistrationDto.getProductDtoList();
        // å¼€ç¥¨äº§å“ç™»è®°ä¿®æ”¹
        if(CollectionUtils.isNotEmpty(productDtoList)){
            for (InvoiceRegistrationProductDto invoiceRegistrationProductDto : productDtoList) {
                InvoiceRegistrationProduct invoiceRegistrationProduct = new InvoiceRegistrationProduct();
                BeanUtils.copyProperties(invoiceRegistrationProductDto, invoiceRegistrationProduct);
                invoiceRegistrationProductMapper.updateById(invoiceRegistrationProduct);
            }
        }
    }
    /**
     * å¼€ç¥¨ç™»è®°åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param invoiceRegistrationDto
     * @return
     */
    @Override
    public IPage<InvoiceRegistrationDto> invoiceRegistrationListPage(Page page, InvoiceRegistrationDto invoiceRegistrationDto) {
        return null;
    }
    /**
     * å¼€ç¥¨ç™»è®°äº§å“æŸ¥è¯¢
     * @param invoiceRegistrationProductDto
     * @return
     */
    @Override
    public List<InvoiceRegistrationProductDto> invoiceRegistrationProductList(InvoiceRegistrationProductDto invoiceRegistrationProductDto) {
        return Collections.emptyList();
    }
}
src/main/resources/mapper/sales/InvoiceRegistrationMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.sales.mapper.InvoiceRegistrationMapper">
    <select id="invoiceRegistrationListPage" resultType="com.ruoyi.sales.dto.InvoiceRegistrationDto">
        SELECT
            id              ,
            sales_ledger_id   ,
            sales_contract_no ,
            customer_id       ,
            salesman          ,
            project_name      ,
            create_time       ,
            create_user       ,
            update_time       ,
            update_user       ,
            tenant_id
        FROM invoice_registration
    </select>
</mapper>
src/main/resources/mapper/sales/InvoiceRegistrationProductMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper">
    <select id="invoiceRegistrationProductList" resultType="com.ruoyi.sales.dto.InvoiceRegistrationDto">
        SELECT
            id   ,
            sales_ledger_id           ,
            sales_ledger_product_id   ,
            invoice_registration_id   ,
            product_category          ,
            specification_model       ,
            unit                      ,
            quantity                  ,
            tax_rate                  ,
            tax_inclusive_unit_price  ,
            tax_inclusive_total_price ,
            tax_exclusive_total_price ,
            invoice_type              ,
            invoice_num               ,
            invoice_amount            ,
            no_invoice_num            ,
            no_invoice_amount         ,
            create_time               ,
            create_user               ,
            update_time               ,
            update_user               ,
            tenant_id                 ,
        FROM invoice_registration_product
        <where>
            <if test="invoiceRegistrationProductDto.invoiceRegistrationId != null">
                invoice_registration_id = #{invoiceRegistrationProductDto.invoiceRegistrationId}
            </if>
        </where>
    </select>
</mapper>