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);