李白
6 天以前 b58c3bf0e4c9bf4327b749040c3490fd2d0970b2
开票信息修改
12个文件已修改
278 ■■■■ 已修改文件
platformx-boot/src/main/resources/application-dev.yml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-boot/src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractOutBound.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Product.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/SaleCredit.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipInvoice.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/FileBip.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResult.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResultItem.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundVo.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ProductController.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/SaleCreditController.java 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-boot/src/main/resources/application-dev.yml
@@ -2,7 +2,7 @@
  data:
    redis:
      host: 127.0.0.1
      password: 123456
      #password: 123456
      database: 0
  # 数据库相关配置
  datasource:
@@ -37,8 +37,6 @@
# swagger 配置
swagger:
  token-url: ${swagger.gateway}/admin/oauth2/token
# 文件上传配置
file:
platformx-boot/src/main/resources/application.yml
@@ -1,10 +1,10 @@
server:
  port: 8899    # 项目端口
  port: 8888    # 项目端口
  servlet:
    context-path: /business  # 项目访问路径
servers:
  main-url: http://127.0.0.1:9999/admin
  business-url: http://127.0.0.1:8899/business
  business-url: http://127.0.0.1:8888/business
spring:
  application:
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractOutBound.java
@@ -82,8 +82,8 @@
    //以下开票相关
    @Schema(description = "销售挂账id")
    @Column(columnDefinition = "bigint default null comment '销售挂账id'")
    @Schema(description = "结算id")
    @Column(columnDefinition = "bigint default null comment '结算id'")
    private Long saleCreditId;
    @Schema(description = "开票状态(0-未开票 1-开票中 2-已开票)")
@@ -104,6 +104,10 @@
    @Column(columnDefinition = "bigint comment '产品id'")
    private Long productId;
    @Schema(description = "开票产品名称")
    @Column(columnDefinition = "VARCHAR(50) comment '开票产品名称'")
    private String invoiceName;
    @Schema(description = "税率(百分比,如13表示13%)")
    @Column(columnDefinition = "double default 0.00 comment '税率'")
    private Double taxRate;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Product.java
@@ -22,9 +22,10 @@
@Table(name = "product")
@Comment("产品信息")
public class Product extends BaseModel<Product> {
    //产品名称、产品编码(主数据、ERP)、产品价格、税点、所属上级
    @Schema(description = "产品名称")
    @Column(columnDefinition = "VARCHAR(50) comment '产品名称'")
    @Column(columnDefinition = "VARCHAR(512) comment '产品名称'")
    private String productName;
    @Schema(description = "产品集团编码")
@@ -59,6 +60,11 @@
    @Column(columnDefinition = "bigint default 0 comment '父ID'")
    private Long parentId;
    @Schema(description = "父名称")
    @Transient
    @TableField(exist = false)
    private String parentName;
    /**
     * 标的物
     */
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/SaleCredit.java
@@ -1,8 +1,10 @@
package com.by4cloud.platformx.business.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.by4cloud.platformx.business.vo.ContractOutBoundVo;
import com.by4cloud.platformx.common.data.mybatis.BaseModel;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
@@ -10,8 +12,10 @@
import jakarta.persistence.Transient;
import lombok.Data;
import org.hibernate.annotations.Comment;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
@@ -22,7 +26,7 @@
@Data
@Entity
@Table(name = "sale_credit")
@Comment("销售挂账")
@Comment("结算记录")
public class SaleCredit  extends BaseModel<SaleCredit> {
    @Schema(description = "销售编号")
@@ -89,8 +93,8 @@
    @Column(name = "contact_phone_b",columnDefinition = "VARCHAR(50) comment '乙方联系电话'")
    private String contactPhoneB;
    @Schema(description = "挂账金额")
    @Column(columnDefinition = "decimal(10,2) comment '挂账金额'")
    @Schema(description = "总金额")
    @Column(columnDefinition = "decimal(10,2) comment '总金额'")
    private BigDecimal totalAmount;
    @Schema(description = "挂账金额总税额")
@@ -129,10 +133,22 @@
    @Column(columnDefinition = "bigint default null comment '蓝票id'")
    private Long blueInvoiceResultId;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Schema(description = "蓝票开票时间")
    @Column(columnDefinition = "datetime comment '蓝票开票时间'")
    private Date blueInvoiceTime;
    @Schema(description = "红票id")
    @Column(columnDefinition = "bigint default null comment '红票id'")
    private Long redInvoiceResultId;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Schema(description = "红票开票时间")
    @Column(columnDefinition = "datetime comment '红票开票时间'")
    private Date redInvoiceTime;
    @Schema(description = "开票详情")
    @Column(columnDefinition = "TEXT comment '开票详情'")
    private String invoiceRemark;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipInvoice.java
@@ -7,13 +7,14 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import lombok.Data;
import org.hibernate.annotations.Comment;
import org.springframework.format.annotation.DateTimeFormat;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Transient;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import java.util.Date;
/**
@@ -24,7 +25,7 @@
@Data
@Entity
@org.hibernate.annotations.Table(appliesTo="bip_invoice",comment = "bip对应单据表")//bip对应单据表
@jakarta.persistence.Table(name = "bip对应单据表")//bip对应单据表
@jakarta.persistence.Table(name = "bip_invoice")//bip对应单据表
@Comment("bip对应单据表")
public class BipInvoice extends BaseModel<BipInvoice> {
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/FileBip.java
@@ -1,14 +1,12 @@
package com.by4cloud.platformx.business.entity.invoice;
import com.baomidou.mybatisplus.annotation.TableName;
import com.by4cloud.platformx.common.data.mybatis.BaseModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.hibernate.annotations.Comment;
import jakarta.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
/**
 * @author kdq
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResult.java
@@ -1,15 +1,12 @@
package com.by4cloud.platformx.business.entity.invoice;
import com.baomidou.mybatisplus.annotation.TableName;
import com.by4cloud.platformx.common.data.mybatis.BaseModel;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import lombok.Data;
import org.hibernate.annotations.Comment;
import jakarta.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Entity;
/**
 * @author kdq
@@ -24,8 +21,8 @@
@jakarta.persistence.Table(name = "fp_invoice_result")//开具发票返回值
@Comment("开具发票返回值")
public class InvoiceResult extends BaseModel<InvoiceResult> {
    @Schema(description = "销售挂账id")
    @Column(columnDefinition = "bigint default null comment '销售挂账id'")
    @Schema(description = "结算记录id")
    @Column(columnDefinition = "bigint comment '结算记录id'")
    private Long saleCreditId;
    @Schema(description = "推送bip")
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResultItem.java
@@ -5,10 +5,9 @@
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.hibernate.annotations.Comment;
import jakarta.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Entity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
/**
 * @author kdq
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundVo.java
@@ -13,6 +13,9 @@
    @Schema(description = "产品id")
    private Long productId;
    @Schema(description = "开票名称")
    private String invoiceName;
    @Schema(description = "税率(百分比,如13表示13%)")
    private Double taxRate;
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ProductController.java
@@ -54,7 +54,18 @@
        wrapper.like(StrUtil.isNotEmpty(product.getProductName()),Product::getProductName,product.getProductName());
        wrapper.like(StrUtil.isNotEmpty(product.getMainCode()),Product::getMainCode,product.getMainCode());
        wrapper.like(StrUtil.isNotEmpty(product.getErpCode()),Product::getErpCode,product.getErpCode());
        return R.ok(productService.page(page, wrapper));
        Page<Product> page1 = productService.page(page, wrapper);
        List<Product> list = page1.getRecords();
        for(Product product1 : list){
            Product  parent = productService.getById(product1.getParentId());
            if(parent==null){
                product1.setParentName("根级产品");
            }else {
                product1.setParentName(parent.getProductName());
            }
        }
        page1.setRecords(list);
        return R.ok(page1);
    }
    /**
@@ -74,6 +85,23 @@
    }
    /**
     * 分页查询
     * @param product 产品信息
     * @return
     */
    @Operation(summary = "分页查询" , description = "分页查询" )
    @GetMapping("/listByParentId" )
    @PreAuthorize("@pms.hasPermission('business_product_view')" )
    //@Inner(value = false)
    public R getProductListByParentId(@ParameterObject Product product) {
        LambdaQueryWrapper<Product> wrapper = Wrappers.lambdaQuery();
        wrapper.like(StrUtil.isNotEmpty(product.getProductName()),Product::getProductName,product.getProductName());
        wrapper.eq(product.getParentId()!=null,Product::getParentId,product.getParentId());
        wrapper.last("limit 30");
        return R.ok(productService.list(wrapper));
    }
    /**
     * 层级查询
     * @param product 商品表
     * @return
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/SaleCreditController.java
@@ -2,6 +2,7 @@
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -16,6 +17,7 @@
import com.by4cloud.platformx.business.service.*;
import com.by4cloud.platformx.business.vo.ContractOutBoundVo;
import com.by4cloud.platformx.common.core.util.R;
import com.by4cloud.platformx.common.data.mybatis.BaseModel;
import com.by4cloud.platformx.common.excel.annotation.ResponseExcel;
import com.by4cloud.platformx.common.log.annotation.SysLog;
import com.by4cloud.platformx.common.security.annotation.Inner;
@@ -28,6 +30,7 @@
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@@ -119,6 +122,8 @@
        if(contractOutBoundList.size()==0){
            return R.failed("请选择出库单!");
        }
        //开票之前,先记录开票信息
        //1.出库单进行标记,将出库单发票记录id填入。将InvoiceSatus=1开票中。
        String outBoundIds = "";
        for(ContractOutBoundVo vo : contractOutBoundList){
            if(StrUtil.isEmpty(outBoundIds)){
@@ -140,12 +145,14 @@
            outBound.setInvoiceSatus(1);
            contractOutBoundService.updateById(outBound);
        }
        //结算中记录出库单ids.
        saleCredit.setOutBoundIds(outBoundIds);
        //生成结算单号
        saleCredit.setEntrustCode("JsNo"+System.currentTimeMillis());
        saleCreditService.updateById(saleCredit);
        //生成vo
        InvoicingVo invoicingVo = invoiceService.toGetByCompareByVo(saleCredit,contractOutBoundList);
       /* InvoicingVo invoicingVo = invoiceService.toGetByCompareByVo(saleCredit,contractOutBoundList);
        try {
            Map<String, Object> objectMap = invoiceService.toKaipiao(invoicingVo);
            Boolean success = (Boolean) objectMap.get("success");
@@ -157,15 +164,14 @@
                //StringBuffer errMsg = new StringBuffer();
                BipResVo bipResVo = bipYsService.sendBIPYs(saleCredit);
                if (!bipResVo.getCode().equals("200")) {
                    /*if (StrUtil.isNotEmpty(errMsg)) {
                    *//*if (StrUtil.isNotEmpty(errMsg)) {
                        errMsg.append(",");
                    }
                    errMsg.append(saleCredit.getCreditCodeB()+ "应收发票推送失败:" + bipResVo.getMessage());*/
                    errMsg.append(saleCredit.getCreditCodeB()+ "应收发票推送失败:" + bipResVo.getMessage());*//*
                    return R.failed("开票成功,推送bip失败,err:" + bipResVo.getMessage());
                }else{
                    return R.ok("开票成功,推送big成功!");
                }
            }else{
                saleCredit.setStatus(2);
                saleCreditService.updateById(saleCredit);
@@ -176,11 +182,158 @@
            saleCredit.setStatus(3);
            saleCreditService.updateById(saleCredit);
            return R.failed("开票失败!");
        }
        }*/
       //return R.ok("销售挂账生成!");
        //出库单已开票
        List<ContractOutBound> contractOutBounds = contractOutBoundService.list(new LambdaQueryWrapper<ContractOutBound>()
                .eq(ContractOutBound::getSaleCreditId,saleCredit.getId())
        );
        for(ContractOutBound contractOutBound : contractOutBounds){
            contractOutBound.setInvoiceSatus(2);
        }
        contractOutBoundService.updateBatchById(contractOutBounds);
        //开票成功
        //开票记录单蓝票信息存储
        saleCredit.setBlueResultStatus(1);
        saleCredit.setInvoiceRemark("开票成功!");
        saleCredit.setBlueInvoiceTime(DateTime.now());
        saleCreditService.updateById(saleCredit);
        //相关合同金额和开票状态进行修改。
        Contract contract = contractService.getById(saleCredit.getContractId());
        String billingStatus = contract.getBillingStatus();
        if(contract.getBillingAmout()==null){
            contract.setBillingAmout(saleCredit.getTotalAmount());
        }else{
            contract.setBillingAmout(contract.getBillingAmout().add(saleCredit.getTotalAmount()));
        }
        int res = contract.getAmount().compareTo(contract.getBillingAmout());
        if("2".equals(billingStatus)) {
            if (res == 0) {
                contract.setBillingStatus("3");
            } else if (res > 0) {
                contract.setBillingStatus("2");
            } else {
                return R.failed("已付金额不能大于总金额!");
            }
        }
        contractService.updateById(contract);
        return R.ok("开票成功,推送bip成功!");
    }
    /**
     * 拼接销售挂账
     * @param contract1 销售挂账
     * @return R
     */
    @Operation(summary = "获取发票列表" , description = "获取发票列表" )
    @SysLog("获取发票列表" )
    @GetMapping("/getInvoices")
    @PreAuthorize("@pms.hasPermission('business_saleCredit_view')" )
    public R getInvoices(@ParameterObject Contract contract1) {
        Contract contract = contractService.getById(contract1.getId());
        if(contract==null){
            return R.failed("合同id错误");
        }
        List<SaleCredit> saleCredits = saleCreditService.list(new LambdaQueryWrapper<SaleCredit>()
                .eq(SaleCredit::getContractId,contract1.getId())
                .orderByAsc(BaseModel::getCreateTime)
        );
        for(SaleCredit saleCredit : saleCredits){
            if(saleCredit.getRedResultStatus()!=null && saleCredit.getRedResultStatus()>0){//说明已开红票
                saleCredit.setBlueResultStatus(0);
                if(saleCredit.getRedResultStatus()==1){
                    saleCredit.setInvoiceRemark("开红票成功!");
                    saleCredit.setInvoicRedUrl("红票url");
                }else{
                    //显示 saleCredit.getInvoiceRemark();
                }
            }else{
                if(saleCredit.getBlueResultStatus()==1){
                    saleCredit.setInvoiceRemark("开蓝票成功!");
                    saleCredit.setInvoicUrl("蓝票url");
                }else if(saleCredit.getBlueResultStatus()==2){
                    //显示 saleCredit.getInvoiceRemark();
                }
            }
        }
        return R.ok(saleCredits);
    }
    /**
     * 拼接销售挂账
     * @param saleCredit1 销售挂账
     * @return R
     */
    @Operation(summary = "红冲发票" , description = "红冲发票" )
    @SysLog("红冲发票" )
    @PostMapping("/toRedStamp")
    @PreAuthorize("@pms.hasPermission('business_saleCredit_edit')" )
    public R toRedStamp(@RequestBody SaleCredit saleCredit1) {
        if(saleCredit1.getId()==null){
            return R.failed("销售挂账id不能为空!");
        }
        SaleCredit saleCredit = saleCreditService.getById(saleCredit1.getId());
        if(saleCredit==null){
            return R.failed("销售挂账id不能为空!");
        }
        /*try {
            Map<String, Object> map = invoiceService.toRedTicket(saleCredit);
            Boolean success = (Boolean) map.get("success");
            if(success){
                return R.ok("红字开票成功");
            }else {
                return R.failed((String) map.get("message"));
            }
        }catch (Exception e){
            e.printStackTrace();
            return R.failed("红字开票失败");
        }*/
        //出库单恢复到未开票状态
        List<ContractOutBound> outBoundList = contractOutBoundService.list(new LambdaQueryWrapper<ContractOutBound>()
                .eq(ContractOutBound::getSaleCreditId,saleCredit.getId())
        );
        for(ContractOutBound outBound : outBoundList){
            outBound.setInvoiceSatus(0);
            outBound.setSaleCreditId(0l);
        }
        contractOutBoundService.updateBatchById(outBoundList);
        saleCredit.setRedInvoiceTime(DateTime.now());
        saleCredit.setRedResultStatus(1);
        saleCredit.setInvoiceRemark("开红票成功!");
        saleCreditService.updateById(saleCredit);
        //合同已开票金额和状态还原
        Contract contract = contractService.getById(saleCredit.getContractId());
        String billingStatus = contract.getBillingStatus();
        BigDecimal bill = contract.getBillingAmout() == null ? BigDecimal.ZERO : contract.getBillingAmout();
        BigDecimal credit = saleCredit.getTotalAmount() == null ? BigDecimal.ZERO : saleCredit.getTotalAmount();
        BigDecimal diff = bill.subtract(credit);
        int res = diff.compareTo(BigDecimal.ZERO);
        if("3".equals(billingStatus)){
            if(res>=0){
                contract.setBillingStatus("2");
                contract.setBillingAmout(BigDecimal.ZERO);
            }else{
                return R.failed("已开票金额负数报错!");
            }
        }
        contractService.updateById(contract);
        return R.ok("红冲开票成功!");
    }
@@ -234,23 +387,28 @@
                    ContractOutBoundVo vo = new ContractOutBoundVo();
                    BeanUtil.copyProperties(outBound,vo);
                    Product product = productService.getOne(new LambdaQueryWrapper<Product>().eq(Product::getErpCode,outBound.getSubjectMatterCode()).last("limit 1"));
                    Product productP = productService.getOne(new LambdaQueryWrapper<Product>().eq(Product::getId,product.getParentId()).last("limit 1"));
                    if(product!=null){
                        vo.setProductId(product.getId());
                        vo.setInvoiceName("*"+product.getTaxClass()+"*" + (productP!=null?productP.getProductName():"") + "*");
                        vo.setTaxClass(product.getTaxClass());
                        vo.setTaxCode(product.getTaxCode());
                        vo.setTaxRate(product.getTaxRate());
                    }
                    ContractSubjectMatter matter = contractSubjectMatterService.getOne(new LambdaQueryWrapper<ContractSubjectMatter>()
                            .eq(ContractSubjectMatter::getContractId,contract.getId())
                            .eq(ContractSubjectMatter::getMaterialCode,outBound.getSubjectMatterCode())
                            .last("limit 1")
                    );
                    if(matter!=null){
                        vo.setSpecification(matter.getSpecification());
                        vo.setUnit(matter.getUnit());
                        vo.setUnitPrice(matter.getUnitPrice());
                    }
                    list.add(vo);
                }
                saleCredit.setContractOutBoundList(list);