platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BillingInfo.java
New file @@ -0,0 +1,191 @@ 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; 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; /** * @author lwj * @version 1.0.0 * @ClassName BillingInfo.java * @Description TODO * @createTime */ @Data @Entity @org.hibernate.annotations.Table(appliesTo="billing_info",comment = "开票信息表")//给表加注释 @jakarta.persistence.Table(name = "billing_info")//开具发票返回值 @Comment("开票信息表") public class BillingInfo extends BaseModel<BillingInfo> { @Schema(description = "开票编号") @Column(columnDefinition = "VARCHAR(64) comment '开票编号'") private String entrustCode; @Schema(description = "开票种类(0-蓝票 1-红票)") @Column(columnDefinition = "tinyint(2) default 0 comment '开票种类(0-蓝票 1-红票)'") private Integer billingType; @Schema(description = "红票关联蓝票Id") @Column(columnDefinition = "bigint comment '红票关联蓝票Id'") private Long blueInvoiceId; @Schema(description = "关联合同ID") @Column(columnDefinition = "bigint not null comment '关联合同ID'") private Long contractId; @Schema(description = "合同编号") @Column(columnDefinition = "VARCHAR(64) comment '合同编号'") private String contractNo; @Schema(description = "合同名称") @Column(columnDefinition = "VARCHAR(64) comment '合同名称'") private String contractName; @Schema(description = "甲方id") @Column(name = "party_a_id",columnDefinition = "bigint comment '甲方id'") private Long partyAId; @Schema(description = "甲方名称") @Column(name = "party_a",columnDefinition = "VARCHAR(100) comment '甲方名称'") private String partyA; @Schema(description = "甲方统一社会信用代码") @Column(name = "credit_code_a",columnDefinition = "VARCHAR(30) comment '甲方统一社会信用代码'") private String creditCodeA; @Schema(description = "甲方开户银行") @Column(name = "bank_name_a",columnDefinition = "VARCHAR(20) comment '甲方开户银行'") private String bankNameA; @Schema(description = "甲方银行账号") @Column(name = "bank_account_a",columnDefinition = "VARCHAR(50) comment '甲方银行账号'") private String bankAccountA; @Schema(description = "甲方联系电话") @Column(name = "contact_phone_a",columnDefinition = "VARCHAR(50) comment '甲方联系电话'") private String contactPhoneA; @Schema(description = "乙方id") @Column(name = "party_b_id",columnDefinition = "bigint comment '乙方id'") private Long partyBId; @Schema(description = "乙方名称") @Column(name = "party_b",columnDefinition = "VARCHAR(100) comment '乙方名称'") private String partyB; @Schema(description = "乙方统一社会信用代码") @Column(name = "credit_code_b",columnDefinition = "VARCHAR(30) comment '乙方统一社会信用代码'") private String creditCodeB; @Schema(description = "乙方开户银行") @Column(name = "bank_name_b",columnDefinition = "VARCHAR(20) comment '乙方开户银行'") private String bankNameB; @Schema(description = "乙方银行账号") @Column(name = "bank_account_b",columnDefinition = "VARCHAR(50) comment '乙方银行账号'") private String bankAccountB; @Schema(description = "乙方联系电话") @Column(name = "contact_phone_b",columnDefinition = "VARCHAR(50) comment '乙方联系电话'") private String contactPhoneB; @Schema(description = "总金额") @Column(columnDefinition = "decimal(10,2) comment '总金额'") private BigDecimal totalAmount; @Schema(description = "税额") @Column(columnDefinition = "decimal(10,2) comment '总金额税额'") private BigDecimal totalTax; @Schema(description = "不含税金额") @Column(columnDefinition = "decimal(10,2) comment '不含税金额'") private BigDecimal amountNoTax; @Schema(description = "标的物详情") @Column(columnDefinition = "TEXT comment '标的物详情'") private String matterStr; @Schema(description = "状态(0-生效 1-失效)") @Column(columnDefinition = "tinyint(2) comment '状态(0-生效 1-失效)'") private Integer status; @Schema(description = "状态(0-未发送 1-发送失败 200-发送成功)") @Column(columnDefinition = "tinyint(2) default 0 comment '状态(200)'") private Integer bipStatus; @Schema(description = "开蓝票结果状态 0未开票 1开票成功 2开票失败") @javax.persistence.Column(columnDefinition="int(1) comment '开蓝票结果状态'") private Integer blueResultStatus; @Schema(description = "开红票结果状态 0未开票 1开票成功 2开票失败") @javax.persistence.Column(columnDefinition="int(1) comment '开红票结果状态'") private Integer redResultStatus; @Schema(description = "蓝票id") @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 = "蓝票地址") @Column(columnDefinition = "varchar(300) comment '蓝票地址'") private String invoicePath; @Schema(description = "蓝票url") @javax.persistence.Column(columnDefinition="VARCHAR(255) comment '蓝票url'") private String invoiceBlueUrl; @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 = "varchar(300) comment '红票地址'") private String invoiceRedPath; @Schema(description = "红冲发票url") @javax.persistence.Column(columnDefinition="VARCHAR(255) comment '红冲发票url'") private String invoiceRedUrl; @Schema(description = "开票详情") @Column(columnDefinition = "TEXT comment '开票详情'") private String invoiceRemark; /** * 出货单列表 */ @Transient @TableField(exist = false) private List<ContractOutBoundVo> contractOutBoundList; /** * 开票项列表 */ @Transient @TableField(exist = false) private List<BillingItem> billingItems; } platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BillingItem.java
New file @@ -0,0 +1,106 @@ package com.by4cloud.platformx.business.entity; 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 java.math.BigDecimal; /** * @author kdq * @version 1.0.0 * @ClassName InvoiceResult.java * @Description TODO * @createTime 10024年11月05日 17:10:00 */ @Data @Entity @org.hibernate.annotations.Table(appliesTo="billing_item",comment = "开票产品信息表")//给表加注释 @jakarta.persistence.Table(name = "billing_item")//开具发票返回值 @Comment("开票产品信息表") public class BillingItem extends BaseModel<BillingItem> { @Schema(description = "开票信息id") @Column(columnDefinition = "bigint comment '开票信息id'") private Long billingInfoId; @Schema(description = "对应合同出库单Ids") @Column(columnDefinition = "VARCHAR(300) comment '对应合同出库单Ids'") private String contractOutBoundIds; @Schema(description = "关联合同ID") @Column(columnDefinition = "bigint not null comment '关联合同ID'") private Long contractId; @Schema(description = "客商ID") @Column(columnDefinition="bigint comment '客商ID'") private Long busGuestId; @Schema(description = "标的物名称") @Column(columnDefinition="VARCHAR(64) comment '标的物名称'") private String subjectMatterName; @Schema(description = "标的物编码") @Column(columnDefinition="VARCHAR(64) comment '标的物编码'") private String subjectMatterCode; @Schema(description = "开票产品数量") @Column(columnDefinition="decimal(10,2) comment '开票产品数量'") private BigDecimal productNum; @Schema(description = "开票状态(0-未开票 1-开票中 2-已开票)") @Column(columnDefinition = "tinyint(2) default 0 comment '开票状态(0-未开票 1-开票中 2-已开票)'") private Integer billingStatus; @Schema(description = "总单价") @Column(columnDefinition = "decimal(10,2) comment '总单价'") private BigDecimal totalPrice; @Schema(description = "总税额") @Column(columnDefinition = "decimal(10,2) comment '总税额'") private BigDecimal totalTax; @Schema(description = "不含税总额") @Column(columnDefinition = "decimal(10,2) comment '不含税总额'") private BigDecimal totalPriceNoTax; //产品信息 @Schema(description = "产品id") @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; @Schema(description = "税收分类") @Column(columnDefinition = "VARCHAR(50) comment '税收分类'") private String taxClass; @Schema(description = "税收编码") @Column(columnDefinition = "VARCHAR(80) comment '税收编码'") private String taxCode; //合同标的物中信息 @Schema(description = "标的物规格/型号") @Column(columnDefinition = "VARCHAR(200) comment '标的物规格/型号'") private String specification; @Schema(description = "计量单位(个/台/吨/项/套等)") @Column(columnDefinition = "VARCHAR(20) comment '计量单位'") private String unit; @Schema(description = "单价") @Column(columnDefinition = "decimal(10,2) comment '单价'") private BigDecimal unitPrice; } platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundVo.java
@@ -2,6 +2,7 @@ import com.by4cloud.platformx.business.entity.ContractOutBound; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.persistence.Column; import lombok.Data; import java.math.BigDecimal; @@ -25,6 +26,12 @@ @Schema(description = "税收编码") private String taxCode; @Schema(description = "不含税总额") private BigDecimal totalPriceNoTax; @Schema(description = "对应合同出库单Ids") private String contractOutBoundIds; //合同标的物中信息 @Schema(description = "标的物规格/型号") platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/InvoicePreviewVo.java
New file @@ -0,0 +1,11 @@ package com.by4cloud.platformx.business.vo; import lombok.Data; import java.util.List; @Data public class InvoicePreviewVo { private Long contractId; private List<Long> contractOutBoundIds; } platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/BillingInfoController.java
New file @@ -0,0 +1,317 @@ package com.by4cloud.platformx.business.controller; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.by4cloud.platformx.admin.api.entity.SysDept; import com.by4cloud.platformx.admin.api.feign.RemoteDeptService; import com.by4cloud.platformx.business.entity.*; import com.by4cloud.platformx.business.entity.invoice.vo.InvoicingVo; import com.by4cloud.platformx.business.invoice.service.BIPYsService; import com.by4cloud.platformx.business.entity.invoice.vo.BipResVo; import com.by4cloud.platformx.business.invoice.service.FpInvoiceResultService; import com.by4cloud.platformx.business.service.*; import com.by4cloud.platformx.business.vo.ContractOutBoundVo; import com.by4cloud.platformx.business.vo.InvoicePreviewVo; import com.by4cloud.platformx.common.core.util.R; import com.by4cloud.platformx.common.data.mybatis.BaseModel; import com.by4cloud.platformx.common.log.annotation.SysLog; import com.by4cloud.platformx.common.security.annotation.Inner; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.persistence.Column; import org.springframework.security.access.prepost.PreAuthorize; import com.by4cloud.platformx.common.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import org.springdoc.core.annotations.ParameterObject; import org.springframework.http.HttpHeaders; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.stream.Collectors; /** * 开票信息 * * @author wjli * @date 2026-06-04 10:50:20 */ @RestController @RequiredArgsConstructor @RequestMapping("/billingInfo" ) @Tag(description = "billingInfo" , name = "开票信息管理" ) @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class BillingInfoController { private final BillingInfoService billingInfoService; private final BillingItemService billingItemService; private final ContractService contractService; private final ContractOutBoundService contractOutBoundService; private final InvoiceService invoiceService; private final BIPYsService bipYsService; /** * 通过id查询开票信息 * @param id id * @return R */ @Operation(summary = "通过id查询" , description = "通过id查询" ) @GetMapping("/getById/{id}" ) public R getById(@PathVariable("id" ) Long id) { return R.ok(billingInfoService.getById(id)); } /** * 拼接发票信息 * @param previewVo 合同ID和出库单ID * @return R */ @Operation(summary = "拼接发票信息" , description = "拼接发票信息" ) @SysLog("拼接发票信息" ) @GetMapping("/saveInvoice") @Inner(value = false) public R saveInvoice(@ParameterObject InvoicePreviewVo previewVo) { //参数判断 if(previewVo.getContractId() == null){ return R.failed("合同id不能为空"); } Contract contractTemp = contractService.getById(previewVo.getContractId()); if(contractTemp == null){ return R.failed("合同id错误"); } BillingInfo billingInfo = billingInfoService.getInviceByContractId(previewVo,contractTemp,1); //拼装开票项内容 List<ContractOutBoundVo> contractOutBoundVos = billingInfo.getContractOutBoundList(); if(contractOutBoundVos!=null && !contractOutBoundVos.isEmpty()) { for(ContractOutBoundVo vo : contractOutBoundVos){ BillingItem item = new BillingItem(); //开票信息id item.setBillingInfoId(billingInfo.getId()); //关联合同ID item.setContractId(billingInfo.getContractId()); //开票产品名称 item.setInvoiceName(vo.getInvoiceName()); //客商ID item.setBusGuestId(vo.getBusGuestId()); //产品id item.setProductId(vo.getProductId()); //标的物规格/型号 item.setSpecification(vo.getSpecification()); //开票产品数量 item.setProductNum(vo.getOutBoundNum()); //标的物编码 item.setSubjectMatterCode(vo.getSubjectMatterCode()); //标的物名称 item.setSubjectMatterName(vo.getSubjectMatterName()); //计量单位(个/台/吨/项/套等) item.setUnit(vo.getUnit()); //开票状态(0-未开票 1-开票中 2-已开票) item.setBillingStatus(1); //总单价 item.setTotalPrice(vo.getTotalPrice()); //单价 item.setUnitPrice(vo.getUnitPrice()); //税收分类 item.setTaxClass(vo.getTaxClass()); //税收编码 item.setTaxCode(vo.getTaxCode()); //总税额 item.setTotalTax(vo.getTotalTax()); //税率(百分比,如13表示13%) item.setTaxRate(vo.getTaxRate()); //不含税总额 item.setTotalPriceNoTax(vo.getTotalPriceNoTax()); //所关联出库单ID item.setContractOutBoundIds(vo.getContractOutBoundIds()); billingItemService.save(item); } } //生成vo /*InvoicingVo invoicingVo = invoiceService.toGetByCompareByVo1(billingInfo,contractOutBoundVos); try { Map<String, Object> objectMap = invoiceService.toKaipiao(invoicingVo); Boolean success = (Boolean) objectMap.get("success"); String message = (String) objectMap.get("message"); //System.out.println(saleCredit.getEntrustCode() + "的railwayEntrust蓝字开票结果为:" + success + "------" + message); if(success){ billingInfo.setBlueResultStatus(1); billingInfoService.updateById(billingInfo); //推bi'p BipResVo bipResVo = bipYsService.sendBIPYss(billingInfo); if (!bipResVo.getCode().equals("200")) { *//*if (StrUtil.isNotEmpty(errMsg)) { errMsg.append(","); } errMsg.append(saleCredit.getCreditCodeB()+ "应收发票推送失败:" + bipResVo.getMessage());*//* billingInfo.setBipStatus(1); billingInfoService.updateById(billingInfo); return R.failed("开票成功,推送bip失败,err:" + bipResVo.getMessage()); }else{ billingInfo.setBipStatus(200); billingInfoService.updateById(billingInfo); return R.ok("开票成功,推送big成功!"); } }else{ billingInfo.setBlueResultStatus(2); billingInfoService.updateById(billingInfo); return R.failed("开票失败!err:" + message); } }catch (Exception e){ billingInfo.setStatus(3); billingInfoService.updateById(billingInfo); return R.failed("开票失败!err:" + e.getMessage()); }*/ //出库单已开票 List<ContractOutBound> contractOutBounds = contractOutBoundService.list(new LambdaQueryWrapper<ContractOutBound>() .eq(ContractOutBound::getSaleCreditId,billingInfo.getId()) ); for(ContractOutBound contractOutBound : contractOutBounds){ contractOutBound.setInvoiceSatus(2); } contractOutBoundService.updateBatchById(contractOutBounds); //开票成功 //开票记录单蓝票信息存储 billingInfo.setBlueResultStatus(1); billingInfo.setInvoiceRemark("开票成功!"); billingInfo.setBlueInvoiceTime(DateTime.now()); billingInfoService.updateById(billingInfo); //相关合同金额和开票状态进行修改。 Contract contract = contractService.getById(billingInfo.getContractId()); String billingStatus = contract.getBillingStatus(); if(contract.getBillingAmout()==null){ contract.setBillingAmout(billingInfo.getTotalAmount()); }else{ contract.setBillingAmout(contract.getBillingAmout().add(billingInfo.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 billingInfo1 开票信息 * @return R */ @Operation(summary = "开发票" , description = "开发票" ) @SysLog("开发票" ) @PostMapping("/toRedStamp") @PreAuthorize("@pms.hasPermission('business_saleCredit_edit')" ) public R toRedStamp(@RequestBody BillingInfo billingInfo1) { if(billingInfo1.getId()==null){ return R.failed("开票信息id不能为空!"); } BillingInfo billingInfo = billingInfoService.getById(billingInfo1.getId()); if(billingInfo==null){ return R.failed("开票信息id不能错误!"); } /* try { Map<String, Object> map = invoiceService.toRedTicket1(billingInfo); 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,billingInfo.getId()) ); for(ContractOutBound outBound : outBoundList){ outBound.setInvoiceSatus(0); outBound.setSaleCreditId(0l); } contractOutBoundService.updateBatchById(outBoundList); billingInfo.setRedInvoiceTime(DateTime.now()); billingInfo.setRedResultStatus(1); billingInfo.setInvoiceRemark("开红票成功!"); billingInfoService.updateById(billingInfo); //合同已开票金额和状态还原 Contract contract = contractService.getById(billingInfo.getContractId()); String billingStatus = contract.getBillingStatus(); BigDecimal bill = contract.getBillingAmout() == null ? BigDecimal.ZERO : contract.getBillingAmout(); BigDecimal credit = billingInfo.getTotalAmount() == null ? BigDecimal.ZERO : billingInfo.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("红冲开票成功!"); } /** * 拼接发票信息 * @param previewVo 合同ID和出库单ID * @return R */ @Operation(summary = "拼接发票信息" , description = "拼接发票信息" ) @SysLog("拼接发票信息" ) @GetMapping("/generatorInvoice") @Inner(value = false) public R generatorInvoice(@ParameterObject InvoicePreviewVo previewVo) { //参数判断 if(previewVo.getContractId() == null){ return R.failed("合同id不能为空"); } Contract contract = contractService.getById(previewVo.getContractId()); if(contract == null){ return R.failed("合同id错误"); } BillingInfo billingInfo = billingInfoService.getInviceByContractId(previewVo,contract,0); return R.ok(billingInfo); } } platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/BillingItemController.java
New file @@ -0,0 +1,119 @@ package com.by4cloud.platformx.business.controller; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.by4cloud.platformx.common.core.util.R; import com.by4cloud.platformx.common.log.annotation.SysLog; import com.by4cloud.platformx.business.entity.BillingItem; import com.by4cloud.platformx.business.service.BillingItemService; import org.springframework.security.access.prepost.PreAuthorize; import com.by4cloud.platformx.common.excel.annotation.ResponseExcel; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import org.springdoc.core.annotations.ParameterObject; import org.springframework.http.HttpHeaders; import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.Operation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Objects; /** * 开票产品信息 * * @author wjli * @date 2026-06-04 16:29:33 */ @RestController @RequiredArgsConstructor @RequestMapping("/billingItem" ) @Tag(description = "billingItem" , name = "开票产品信息管理" ) @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class BillingItemController { private final BillingItemService billingItemService; /** * 分页查询 * @param page 分页对象 * @param billingItem 开票产品信息 * @return */ @Operation(summary = "分页查询" , description = "分页查询" ) @GetMapping("/page" ) @PreAuthorize("@pms.hasPermission('business_billingItem_view')" ) public R getBillingItemPage(@ParameterObject Page page, @ParameterObject BillingItem billingItem) { LambdaQueryWrapper<BillingItem> wrapper = Wrappers.lambdaQuery(); return R.ok(billingItemService.page(page, wrapper)); } /** * 通过id查询开票产品信息 * @param id id * @return R */ @Operation(summary = "通过id查询" , description = "通过id查询" ) @GetMapping("/{id}" ) @PreAuthorize("@pms.hasPermission('business_billingItem_view')" ) public R getById(@PathVariable("id" ) Long id) { return R.ok(billingItemService.getById(id)); } /** * 新增开票产品信息 * @param billingItem 开票产品信息 * @return R */ @Operation(summary = "新增开票产品信息" , description = "新增开票产品信息" ) @SysLog("新增开票产品信息" ) @PostMapping @PreAuthorize("@pms.hasPermission('business_billingItem_add')" ) public R save(@RequestBody BillingItem billingItem) { return R.ok(billingItemService.save(billingItem)); } /** * 修改开票产品信息 * @param billingItem 开票产品信息 * @return R */ @Operation(summary = "修改开票产品信息" , description = "修改开票产品信息" ) @SysLog("修改开票产品信息" ) @PutMapping @PreAuthorize("@pms.hasPermission('business_billingItem_edit')" ) public R updateById(@RequestBody BillingItem billingItem) { return R.ok(billingItemService.updateById(billingItem)); } /** * 通过id删除开票产品信息 * @param ids id列表 * @return R */ @Operation(summary = "通过id删除开票产品信息" , description = "通过id删除开票产品信息" ) @SysLog("通过id删除开票产品信息" ) @DeleteMapping @PreAuthorize("@pms.hasPermission('business_billingItem_del')" ) public R removeById(@RequestBody Long[] ids) { return R.ok(billingItemService.removeBatchByIds(CollUtil.toList(ids))); } /** * 导出excel 表格 * @param billingItem 查询条件 * @param ids 导出指定ID * @return excel 文件流 */ @ResponseExcel @GetMapping("/export") @PreAuthorize("@pms.hasPermission('business_billingItem_export')" ) public List<BillingItem> export(BillingItem billingItem,Long[] ids) { return billingItemService.list(Wrappers.lambdaQuery(billingItem).in(ArrayUtil.isNotEmpty(ids), BillingItem::getId, ids)); } } platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/BIPYsService.java
@@ -1,5 +1,6 @@ package com.by4cloud.platformx.business.invoice.service; import com.by4cloud.platformx.business.entity.BillingInfo; import com.by4cloud.platformx.business.entity.SaleCredit; import com.by4cloud.platformx.business.entity.invoice.BipInvoice; import com.by4cloud.platformx.business.entity.invoice.vo.BIPBody; @@ -32,6 +33,8 @@ BipResVo sendBIPYs(SaleCredit railwayEntrust, String id1, String id2, Boolean focus, String customerCode, String customerAddressCode,String businessType, String fromStation, Integer allId, String contractNum, String number, String jyType, String accountUnitNumber, String deptCode, String userCode, Integer isNd); BipResVo sendBIPYs(SaleCredit saleCredit); BipResVo sendBIPYss(BillingInfo billingInfo); /** * * @param railwayEntrust platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/BIPYsServiceImpl.java
@@ -6,6 +6,7 @@ import cn.hutool.json.JSONObject; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.by4cloud.platformx.business.entity.BillingInfo; import com.by4cloud.platformx.business.entity.SaleCredit; import com.by4cloud.platformx.business.entity.invoice.BipInvoice; import com.by4cloud.platformx.business.entity.invoice.InvoiceResult; @@ -689,6 +690,306 @@ return bipResVo; } @Override public BipResVo sendBIPYss(BillingInfo railwayEntrust) { BIPBody bipBody = new BIPBody(); BIPYsMxHeader mx = new BIPYsMxHeader(); List<BIPYsItem> bipYsItems = new ArrayList<>(); // mx.(railwayEntrust.getFyCompName());//发运矿 //mx.setMX01_code(fromStation2);//发站 /*if (accountLedger.getId().equals(80) || accountLedger.getId().equals(81) && !accountLedger.getId().equals(82)) { contractNum = ""; }*/ if (StrUtil.isNotEmpty(railwayEntrust.getContractNo())) { mx.setHTBMBT(1); } else { mx.setHTBMBT(0); } mx.setContractNo(railwayEntrust.getContractNo()); //mx.setMX021_code(customerCode);//收货客户 //mx.setMX031_code(customerCode);//结算客户 //mx.setMX04(number);//结算单号 mx.setMX0401(railwayEntrust.getEntrustCode());//托收单号 //mx.setMX051_code(businessType);//业务种类 //mx.setMX06(createName);//创建人 //mx.setMX07(railwayEntrust.getUserName());//审核人 //mx.setGX08_code(accountUnitNumber);//核算单元 //String remark = getRemark(railwayEntrust, "销", customerCode, id2); mx.setRemarks(railwayEntrust.getInvoiceRemark()); //String fileUrl = fileUploadService.fileUpload(6, railwayEntrust.getId()); mx.setFk_002(3); /*if (StrUtil.isNotEmpty(fileUrl) && "01".equals(jyType)) { mx.setFk_002(3 + fileUrl.split(",").length); }*/ /*if (railwayEntrust.getFatherEntrustId() != null) { fileUrl = fileUploadService.fileUpload(6, contractNum); mx.setFk_002(3); if (StrUtil.isNotEmpty(fileUrl) && "01".equals(jyType)) { mx.setFk_002(3 + fileUrl.split(",").length); } }*/ bipBody.setBustypeCode("MXysfp"); //bipBody.setStaffCode(userCode); // bipBody.setFk_038_code(userCode); bipBody.setObjectType("1"); //bipBody.setCustomerCode(customerCode); bipBody.setExtVouchCode(railwayEntrust.getEntrustCode());//煤销系统单号 //bipBody.setFinanceOrgCode(id2);//开票组织ID bipBody.setDirection("1");//单据方向 1蓝 -1红 bipBody.setBillDate(DateUtil.format(new Date(), "yyyy-MM-dd"));//开票日期 // bipBody.setBillDate(DateUtil.format(railwayEntrust.getBalanceDate(), "yyyy-MM-dd"));//开票日期 // if ("0101".equals(jyType)){ // // } //bipBody.setContractNo(contractNum); //bipBody.setOrgCode(id2);//业务组织id //bipBody.setDeptCode(deptCode); bipBody.setExchangeRateDate(DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss")); // bipBody.setExchangeRateDate(DateUtil.format(railwayEntrust.getBalanceDate(), "yyyy-MM-dd HH:mm:ss")); // bipBody.setCustomer();//客户编码 //bipBody.setRemarks(remark); //表体 //煤种类目 BIPYsItem bipYsItem = new BIPYsItem(); // bipYsItem.setExchangeRateDate(DateUtil.format(railwayEntrust.getBalanceDate(),"yyyy-MM-dd HH:mm:ss")); //bipYsItem.setTaxRate(NumUtils.multiplyDouble(railwayEntrust.getTaxRate(),100d)); //bipYsItem.setUnitName("吨"); /*bipYsItem.setMaterialCode("7704000001"); bipYsItem.setQuantity(BigDecimal.valueOf(railwayEntrust.getTonnage())); bipYsItem.setCustomerCode(customerCode);//客户编码 Double noTaxPrice = railwayEntrust.getPrice(); bipYsItem.setOriTaxAmount(BigDecimal.valueOf(railwayEntrust.getTaxFee()));//税额 String[] codes = expenseItemCode.get().split(","); bipYsItem.setExpenseItemCode(codes[0]); Double allPrice = railwayEntrust.getTotalPrice(); bipYsItem.setOriTaxExcludedAmount(BigDecimal.valueOf(railwayEntrust.getCoalFree()));//原币无税金额 bipYsItem.setOriTaxIncludedAmount(BigDecimal.valueOf(railwayEntrust.getTotalPrice()));//原币含税金额 bipYsItem.setLocalTaxExcludedAmount(BigDecimal.valueOf(railwayEntrust.getCoalFree()));//本币无税金额 bipYsItem.setLocalTaxIncludedAmount(BigDecimal.valueOf(railwayEntrust.getTotalPrice()));//本币含税金额 bipYsItem.setOriTaxExcludedPrice(NumUtils.divideDouble(railwayEntrust.getCoalFree(), railwayEntrust.getTonnage(), 8));//无税单价 bipYsItem.setLocalTaxExcludedPrice(NumUtils.divideDouble(railwayEntrust.getCoalFree(), railwayEntrust.getTonnage(), 8));//无税单价 Double realPrice = NumUtils.divideDouble(railwayEntrust.getTotalPrice(), railwayEntrust.getTonnage(), 8); bipYsItem.setOriTaxIncludedPrice(realPrice);//本币含税单价 bipYsItem.setLocalTaxIncludedPrice(realPrice);//本币含税单价 //分割单金额 if (CompUtils.isTsCustomer(railwayEntrust.getCustomerId())) { if (railwayEntrust.getFatherEntrustId() == null) { Double noTaxMoney = railwayEntrust.getCoalMoney(); Double taxMoney = railwayEntrust.getCoalTaxMoney(); Double allMoney = NumUtils.addDouble(noTaxMoney, taxMoney, 2); allPrice = allMoney; bipYsItem.setOriTaxAmount(BigDecimal.valueOf(taxMoney));//税额 bipYsItem.setOriTaxExcludedAmount(BigDecimal.valueOf(noTaxMoney));//原币无税金额 bipYsItem.setOriTaxIncludedAmount(BigDecimal.valueOf(allMoney));//原币含税金额 bipYsItem.setLocalTaxExcludedAmount(BigDecimal.valueOf(noTaxMoney));//本币无税金额 bipYsItem.setLocalTaxIncludedAmount(BigDecimal.valueOf(allMoney));//本币含税金额 bipYsItem.setOriTaxExcludedPrice(railwayEntrust.getPrice());//无税单价 bipYsItem.setLocalTaxExcludedPrice(railwayEntrust.getPrice());//无税单价 bipYsItem.setOriTaxIncludedPrice(NumUtils.divideDouble(allMoney, railwayEntrust.getTonnage(), 8));//本币含税单价 bipYsItem.setLocalTaxIncludedPrice(NumUtils.divideDouble(allMoney, railwayEntrust.getTonnage(), 8));//本币含税单价 } } bipYsItem.setRemarks(remark);*/ //煤种表体 BIPYsMx bipYsMx = new BIPYsMx(); //bipYsMx.setJT12_code(ncCoalNumber);//物料编码 // bipYsMx.setJT25_code(codes[1]); //bipYsMx.setGX06_code(coalBipCode);//物料名称 //bipYsMx.setMX021_code(customerCode);//收货客户 //bipYsMx.setCustomerCode(customerAddressCode);//客户编码 bipYsMx.setJT06_code("01001001");//款项明细 bipYsMx.setYSYF14_code("2"); /*if (id2!=null){ *//*if (id2 != null && id2.equals("10439") && railwayEntrust.getCoalId() != null && railwayEntrust.getCoalId().equals(45)) { bipYsMx.setJT12_code("0101020401");//物料编码 bipYsMx.setGX06_code("01010201043902438");//物料名称 }*//* if (id2.equals("126") || id2.equals("10439") || id2.equals("1045116") || id2.equals("104810210") || id2.equals("1027902")) { bipBody.setYSYF_08("0"); bipYsMx.setYSYF_08("0"); } if (id2.startsWith("104")) { if (focus) { bipYsMx.setYSYF52("0"); } else { bipYsMx.setYSYF52("1"); } } } bipYsMx.setGX08_code(accountUnitNumber);*/ /*bipYsMx.setMX09(railwayEntrust.getCoalName());//运销煤种 bipYsMx.setMX10(BigDecimal.valueOf(railwayEntrust.getRealTonnage()));//水煤量 bipYsMx.setMX11(railwayEntrust.getAshContentMetering());//灰分 bipYsMx.setMX13(railwayEntrust.getMoistureMetering()); bipYsMx.setMX14(railwayEntrust.getSulFurMetering()); bipYsMx.setMX15(railwayEntrust.getCoalName()); if (railwayEntrust.getInvoiceResultId() == null && !CompUtils.isKp(accountLedger.getId()) && !accountLedger.getId().equals(165)) { throw new RuntimeException("结算单未开票"); }*/ InvoiceResult invoiceResult = fpInvoiceResultService.getById(railwayEntrust.getBlueInvoiceResultId()); if (invoiceResult != null) { bipYsMx.setYSYF33(invoiceResult.getInvoiceNo()); bipYsItem.setInvoiceNo(invoiceResult.getInvoiceNo()); // bipYsMx.setInvoiceNo(invoiceResult.getInvoiceNo()); } bipYsMx.setZzbkfl_code("01"); /*if (StrUtil.isNotEmpty(accountLedger.getZzbkfl())) { bipYsMx.setZzbkfl_code(accountLedger.getZzbkfl()); } String jyType1 = jyType;//特殊交易单 if (jyType.equals("0101") && railwayEntrust.getCustomerId() != null && railwayEntrust.getCustomerId().equals(203)) { jyType1 = "01020202"; } if (jyType.equals("0101") && railwayEntrust.getCustomerId() != null && (railwayEntrust.getCustomerId().equals(172) || railwayEntrust.getCustomerId().equals(200) || railwayEntrust.getCustomerId().equals(2002381))) { jyType1 = "010201"; }*/ //bipYsMx.setJT04_code(jyType1); //bipYsMx.setMX16(railwayEntrust.getTonnage());//折干量 bipYsItem.setFreeChId(bipYsMx); // bipYsMx.setMX18(railwayEntrust.getRealTonnage());//标煤量 // bipYsMx.setMX18(railwayEntrust.getRealPrice());//标煤量单价 //收款计划 /*if (focus) { List<BIPPayPlan> bipPayPlans = this.getBipPayPlan(railwayEntrust, allPrice); bipYsItem.setGrandsonItem(bipPayPlans); }*/ bipYsItems.add(bipYsItem); String invoiceNo = invoiceResult == null ? "" : invoiceResult.getInvoiceNo(); /*if (railwayEntrust.getCustomerId() != null && (railwayEntrust.getCustomerId().equals(618) || railwayEntrust.getCustomerId().equals(608) || railwayEntrust.getCustomerId().equals(1367) || railwayEntrust.getCustomerId().equals(1002134))) { this.getTsBt(railwayEntrust, customerCode, jyType1, focus, bipYsItems, isNd, accountUnitNumber, id2, fromStation, invoiceNo, contractNum); } else { this.getPtBt(railwayEntrust, customerCode, jyType1, focus, bipYsItems, isNd, accountUnitNumber, id2, fromStation, invoiceNo, contractNum); }*/ bipBody.setBodyItem(bipYsItems); /*if (railwayEntrust.getFatherEntrustId() == null && !railwayEntrust.getFyCompId().equals(227) && !order.getFiledId().equals(48)) { List<Contract> contracts = fileUploadService.getContractsByEntrustId(railwayEntrust.getId()); System.out.println("重复合同:" + contracts.size() + "上级ID:" + railwayEntrust.getFatherEntrustId() + "结算单号:" + railwayEntrust.getEntrustCode()); if (contracts != null && contracts.size() > 0) { contracts.forEach(e -> { BIPYsMxHeader newMx = new BIPYsMxHeader(); BeanUtils.copyProperties(mx, newMx); if (accountLedger.getId().equals(80) || accountLedger.getId().equals(81) || accountLedger.getId().equals(82)) { newMx.setContractNo(""); newMx.setHTBMBT(0); } else { newMx.setContractNo(e.getNum()); newMx.setHTBMBT(1); } bipBody.setFreeChId(newMx); }); } } else { bipBody.setFreeChId(mx); }*/ String result = bipHttpUtil.post(BipApiEnum.应收发票保存接口, new JSONObject().set("data", bipBody)); BipResVo resVo = JSONUtil.toBean(result, BipResVo.class); //放到单据记录表 BipInvoice bipInvoice = new BipInvoice(); bipInvoice.setDay(DateUtil.date()); bipInvoice.setInvoice(JSONUtil.toJsonStr(bipBody)); bipInvoice.setType(0); bipInvoice.setInvoiceType(0); bipInvoice.setContractNum(railwayEntrust.getContractNo()); bipInvoice.setRailwayEntrustId(railwayEntrust.getId()); //bipInvoice.setAllId(Long.parseLong(allId+"")); bipInvoice.setBipCompNumber("id2"); bipInvoice.setDirection(1); bipInvoice.setCompId(railwayEntrust.getCompId()); bipInvoice.setResStatus(resVo.getCode()); // bipInvoice.setMoney(railwayEntrust.getAllPrice()); // bipInvoice.setTonnage(railwayEntrust.getTonnage()); // bipInvoice.setPrice(railwayEntrust.getPrice()); //bipInvoice.setTrainType(railwayEntrust.getTrainType()); BipResVo bipResVo = new BipResVo<>(); bipResVo.setCode(resVo.getCode()); BIPBody resBipBody = null; if (resVo.getData() == null) { resBipBody = new BIPBody(); } else { resBipBody = JSONUtil.toBean(resVo.getData().toString(), BIPBody.class); } if (resVo.getCode().equals("200") || (StrUtil.isNotEmpty(resVo.getMessage()) && resVo.getMessage().contains("活动[财务审核]上找不到用户")) || StrUtil.isNotEmpty(resBipBody.getCode())) { bipInvoice.setResInvoice(resVo.getData().toString()); bipInvoice.setBipNumber(resBipBody.getId()); // bipInvoice.setCode("200"); bipInvoice.setCode(resBipBody.getCode()); bipInvoice.setMessage(resVo.getMessage()); bipInvoiceService.save(bipInvoice); bipResVo.setCode("200"); } else { if (resVo.getData() != null && StrUtil.isNotEmpty(resVo.getData().toString())) { bipInvoice.setBipNumber(resBipBody.getId()); bipInvoice.setCode(resBipBody.getCode()); } bipInvoice.setMessage(resVo.getMessage()); bipResVo.setMessage(resVo.getMessage()); bipInvoiceService.save(bipInvoice); } if (resVo.getData() != null && StrUtil.isNotEmpty(resVo.getData().toString())) { if (resBipBody.getId() != null) { try { /*if (railwayEntrust.getTrainType().equals(1)) { if (order != null && order.getCompId() != null && order.getCompId().equals(227) && order.getFiledId() != null && order.getFiledId().equals(48)) { fileUploadService.uploadToBip(railwayEntrust.getId(), resBipBody.getId(), fileUploadService.fileUpload(8, allId)); } else { fileUploadService.uploadToBip(railwayEntrust.getId(), resBipBody.getId(), fileUploadService.fileUpload(0, allId)); } fileUploadService.uploadToBip(railwayEntrust.getId(), resBipBody.getId(), fileUploadService.fileUpload(3, railwayEntrust.getId(), railwayEntrust.getQualityName(), railwayEntrust.getUserCompId())); } else if (railwayEntrust.getTrainType().equals(2)) { fileUploadService.uploadToBip(railwayEntrust.getId(), resBipBody.getId(), fileUploadService.fileUpload(1, allId)); fileUploadService.uploadToBip(railwayEntrust.getId(), resBipBody.getId(), fileUploadService.fileUpload(4, railwayEntrust.getId(), railwayEntrust.getQualityName(), railwayEntrust.getUserCompId())); } if (StrUtil.isNotEmpty(fileUrl)) { for (String s : fileUrl.split(",")) { fileUploadService.uploadUrlToBip(railwayEntrust.getId(), resBipBody.getId(), s); } }*/ //发票 railwayEntrust.setBipStatus(200); fpInvoiceResultService.update(new UpdateWrapper<InvoiceResult>().lambda() .eq(InvoiceResult::getEntrustCode, railwayEntrust.getEntrustCode()) .set(InvoiceResult::getPushBip, null)); //fpInvoiceResultService.pushBlue(railwayEntrust, 0); //fileUploadService.uploadToBip(railwayEntrust.getId(), resBipBody.getId(), fileUploadService.fileUpload(2, allId)); } catch (Exception e) { //railwayEntrust.setBipFileStatus(-1); log.error("结算单推送附件错误---", e); e.printStackTrace(); } } } return bipResVo; } public BipResVo sendBIPYf(SaleCredit railwayEntrust,String id1,String id2,String customerCode,String businessType,String fromStation,Integer allId,String contractNum,String number,String jyType,String accountUnitNumber,String deptCode,String userCode,Integer isNd) { // BipResVo bipResVo1 = new BipResVo<>(); platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/BillingInfoMapper.java
New file @@ -0,0 +1,11 @@ package com.by4cloud.platformx.business.mapper; import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper; import com.by4cloud.platformx.business.entity.BillingInfo; import org.apache.ibatis.annotations.Mapper; @Mapper public interface BillingInfoMapper extends PlatformxBaseMapper<BillingInfo> { } platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/BillingItemMapper.java
New file @@ -0,0 +1,11 @@ package com.by4cloud.platformx.business.mapper; import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper; import com.by4cloud.platformx.business.entity.BillingItem; import org.apache.ibatis.annotations.Mapper; @Mapper public interface BillingItemMapper extends PlatformxBaseMapper<BillingItem> { } platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/BillingInfoService.java
New file @@ -0,0 +1,11 @@ package com.by4cloud.platformx.business.service; import com.baomidou.mybatisplus.extension.service.IService; import com.by4cloud.platformx.business.entity.BillingInfo; import com.by4cloud.platformx.business.entity.Contract; import com.by4cloud.platformx.business.vo.InvoicePreviewVo; public interface BillingInfoService extends IService<BillingInfo> { BillingInfo getInviceByContractId(InvoicePreviewVo previewVo, Contract contract,Integer doType); } platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/BillingItemService.java
New file @@ -0,0 +1,8 @@ package com.by4cloud.platformx.business.service; import com.baomidou.mybatisplus.extension.service.IService; import com.by4cloud.platformx.business.entity.BillingItem; public interface BillingItemService extends IService<BillingItem> { } platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/InvoiceService.java
@@ -1,6 +1,7 @@ package com.by4cloud.platformx.business.service; import com.baomidou.mybatisplus.extension.service.IService; import com.by4cloud.platformx.business.entity.BillingInfo; import com.by4cloud.platformx.business.entity.ContractOutBound; import com.by4cloud.platformx.business.entity.SaleCredit; import com.by4cloud.platformx.business.entity.invoice.InvoiceResult; @@ -14,9 +15,13 @@ Map<String, Object> toRedTicket(SaleCredit saleCredit); Map<String, Object> toRedTicket1(BillingInfo billingInfo); InvoicingVo toGetByCompare(SaleCredit saleCredit, List<ContractOutBound> contractOutBoundList); InvoicingVo toGetByCompareByVo(SaleCredit saleCredit, List<ContractOutBoundVo> contractOutBoundList); InvoicingVo toGetByCompareByVo1(BillingInfo saleCredit, List<ContractOutBoundVo> contractOutBoundList); Map<String, Object> toKaipiao(InvoicingVo invoicingVo); @@ -24,4 +29,5 @@ boolean pushBlue(Long railwayId, Integer type); //0应收 1应付 } platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BillingInfoServiceImpl.java
New file @@ -0,0 +1,235 @@ package com.by4cloud.platformx.business.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.by4cloud.platformx.admin.api.entity.SysDept; import com.by4cloud.platformx.admin.api.feign.RemoteDeptService; import com.by4cloud.platformx.business.entity.*; import com.by4cloud.platformx.business.invoice.service.BIPYsService; import com.by4cloud.platformx.business.mapper.BillingInfoMapper; import com.by4cloud.platformx.business.service.*; import com.by4cloud.platformx.business.vo.ContractOutBoundVo; import com.by4cloud.platformx.business.vo.InvoicePreviewVo; import com.by4cloud.platformx.common.core.util.R; import com.by4cloud.platformx.common.data.mybatis.BaseModel; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * 开票信息 * * @author wjli * @date 2026-06-04 10:50:20 */ @Service @RequiredArgsConstructor public class BillingInfoServiceImpl extends ServiceImpl<BillingInfoMapper, BillingInfo> implements BillingInfoService { private final BillingInfoMapper billingInfoMapper; private final BusinessCustomerService businessCustomerService; private final ContractOutBoundService contractOutBoundService; private final ProductService productService; private final ContractSubjectMatterService contractSubjectMatterService; private final RemoteDeptService remoteDeptService; /* * 拼接开票数据 */ @Override public BillingInfo getInviceByContractId(InvoicePreviewVo previewVo,Contract contract,Integer doType) { Long contractId = previewVo.getContractId(); int showType = 0; // 0为拼接 1 为预览计算 if (previewVo.getContractOutBoundIds() != null && !previewVo.getContractOutBoundIds().isEmpty()) { showType = 1; } BillingInfo billingInfo = new BillingInfo(); billingInfo.setContractId(contractId); billingInfo.setContractName(contract.getContractName()); billingInfo.setContractNo(contract.getContractNo()); BusinessCustomer partA = businessCustomerService.getById(contract.getPartyAId()); if (partA != null) { billingInfo.setPartyA(partA.getCompanyName()); billingInfo.setCreditCodeA(partA.getCreditCode()); billingInfo.setBankAccountA(partA.getBankAccount()); billingInfo.setBankNameA(partA.getBankName()); } R<SysDept> r = remoteDeptService.getById(contract.getPartyBId()); SysDept dept = r.getData(); if (dept != null) { billingInfo.setPartyB(dept.getOrgName()); billingInfo.setCreditCodeB(dept.getOrgCode()); billingInfo.setBankAccountB(dept.getOrgBankAccount()); billingInfo.setBankNameB(dept.getOrgBank()); } if(doType==1) { if (billingInfo.getId() == null) { billingInfoMapper.insert(billingInfo); } } Long billingInfoId = billingInfo.getId(); LambdaQueryWrapper<ContractOutBound> lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(ContractOutBound::getContractId, contract.getId()); lambdaQueryWrapper.eq(ContractOutBound::getInvoiceSatus, 0); if (showType == 1) { lambdaQueryWrapper.in(BaseModel::getId, previewVo.getContractOutBoundIds()); } lambdaQueryWrapper.orderByAsc(ContractOutBound::getOutBoundTime); List<ContractOutBound> outBoundList = contractOutBoundService.list(lambdaQueryWrapper); if (outBoundList != null) { if (!outBoundList.isEmpty()) { List<ContractOutBoundVo> list = new ArrayList<>(); for (ContractOutBound outBound : outBoundList) { if(doType==1){ outBound.setInvoiceSatus(1); outBound.setSaleCreditId(billingInfoId); } 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); } billingInfo.setContractOutBoundList(list); if (showType == 1) { List<ContractOutBoundVo> result = getListGroupingByProductId(list); BigDecimal totalPriceAll = BigDecimal.ZERO; BigDecimal totalTaxAll = BigDecimal.ZERO; BigDecimal totalPriceNoTaxAll = BigDecimal.ZERO; for (ContractOutBoundVo outBoundVo : result) { outBoundVo.setTotalPrice(outBoundVo.getUnitPrice().multiply(outBoundVo.getOutBoundNum()).setScale(2, RoundingMode.HALF_UP)); totalPriceAll = totalPriceAll.add(outBoundVo.getTotalPrice()); outBoundVo.setTotalTax(getTaxAmount(outBoundVo.getTaxRate(), outBoundVo.getTotalPrice())); totalTaxAll = totalTaxAll.add(outBoundVo.getTotalTax()); outBoundVo.setTotalPriceNoTax(getNoTaxAmount(outBoundVo.getTaxRate(), outBoundVo.getTotalPrice())); totalPriceNoTaxAll = totalPriceNoTaxAll.add(outBoundVo.getTotalPriceNoTax()); } billingInfo.setTotalAmount(totalPriceAll); billingInfo.setTotalTax(totalTaxAll); billingInfo.setAmountNoTax(totalPriceNoTaxAll); billingInfo.setContractOutBoundList(result); if(billingInfoId != null){ billingInfoMapper.updateById(billingInfo); }else{ billingInfoMapper.insert(billingInfo); } } if(doType==1){ contractOutBoundService.updateBatchById(outBoundList); } } } return billingInfo; } private List<ContractOutBoundVo> getListGroupingByProductId(List<ContractOutBoundVo> list) { //提取productId List<Long> productIds = list.stream().map(ContractOutBoundVo::getProductId).collect(Collectors.toList()); //去重 List<Long> result = productIds.stream().distinct().collect(Collectors.toList()); List<ContractOutBoundVo> noRest = new ArrayList<>(); for(Long id : result){ ContractOutBoundVo newVo = new ContractOutBoundVo(); int times = 0; String obIds = ""; BigDecimal num = BigDecimal.ZERO; for(ContractOutBoundVo vo : list){ if(vo.getProductId().equals(id)){ times++; if(times == 1){ BeanUtil.copyProperties(vo,newVo); } num = num.add(vo.getOutBoundNum()); if(StrUtil.isEmpty(obIds)){ obIds = "" + vo.getId(); }else{ obIds += "," + vo.getId(); } } } newVo.setOutBoundNum(num); newVo.setContractOutBoundIds(obIds); noRest.add(newVo); } return noRest; } /* if (showType == 1) { //1.不含税金额=含税总额÷(1+税率) //2.税额=含税总额÷(1+税率)x税率 vo.setTotalPrice(vo.getUnitPrice().multiply(outBound.getOutBoundNum()).setScale(2, RoundingMode.HALF_UP)); vo.setTotalTax(getTaxAmount(vo.getTaxRate(), vo.getTotalPrice())); vo.setTotalPriceNoTax(getNoTaxAmount(vo.getTaxRate(), vo.getTotalPrice())); }*/ public BigDecimal getTaxAmount(double taxRate,BigDecimal totalPrice) { // 1、税率转BigDecimal并转为小数 13 → 0.13 BigDecimal taxPercent = BigDecimal.valueOf(taxRate).divide(new BigDecimal("100")); // 1+税率 BigDecimal rateSum = BigDecimal.ONE.add(taxPercent); // 不含税金额,保留2位、四舍五入 BigDecimal noTax = totalPrice.divide(rateSum, 2, RoundingMode.HALF_UP); // 税额 BigDecimal taxAmount = totalPrice.subtract(noTax); return taxAmount; } public BigDecimal getNoTaxAmount(double taxRate,BigDecimal totalPrice){ // 1、税率转BigDecimal并转为小数 13 → 0.13 BigDecimal taxPercent = BigDecimal.valueOf(taxRate).divide(new BigDecimal("100")); // 1+税率 BigDecimal rateSum = BigDecimal.ONE.add(taxPercent); // 不含税金额,保留2位、四舍五入 BigDecimal noTax = totalPrice.divide(rateSum, 2, RoundingMode.HALF_UP); // 税额 //BigDecimal taxAmount = totalPrice.subtract(noTax); return noTax; } } platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BillingItemServiceImpl.java
New file @@ -0,0 +1,16 @@ package com.by4cloud.platformx.business.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.by4cloud.platformx.business.entity.BillingItem; import com.by4cloud.platformx.business.mapper.BillingItemMapper; import com.by4cloud.platformx.business.service.BillingItemService; import org.springframework.stereotype.Service; /** * 开票产品信息 * * @author wjli * @date 2026-06-04 16:29:33 */ @Service public class BillingItemServiceImpl extends ServiceImpl<BillingItemMapper, BillingItem> implements BillingItemService { } platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/InvoiceServiceImpl.java
@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.by4cloud.platformx.business.entity.BillingInfo; import com.by4cloud.platformx.business.entity.ContractOutBound; import com.by4cloud.platformx.business.entity.SaleCredit; import com.by4cloud.platformx.business.entity.invoice.*; @@ -19,6 +20,7 @@ import com.by4cloud.platformx.business.invoice.service.BipInvoiceService; import com.by4cloud.platformx.business.invoice.service.FileUploadService; import com.by4cloud.platformx.business.invoice.service.FpInvoiceResultService; import com.by4cloud.platformx.business.service.BillingInfoService; import com.by4cloud.platformx.business.service.InvoiceService; import com.by4cloud.platformx.business.service.SaleCreditService; import com.by4cloud.platformx.business.vo.ContractOutBoundVo; @@ -54,6 +56,9 @@ private SaleCreditService saleCreditService; @Autowired private BillingInfoService billingInfoService; @Autowired private FpInvoiceResultService invoiceResultService; @Autowired @@ -61,6 +66,8 @@ @Autowired private FileUploadService fileUploadService; @Value("${BWInvoice.ip}") private String invoiceIp; @@ -86,6 +93,11 @@ } @Override public Map<String, Object> toRedTicket1(BillingInfo billingInfo) { return redTicket1(billingInfo); } @Override public InvoicingVo toGetByCompare(SaleCredit saleCredit, List<ContractOutBound> contractOutBoundList) { return getByCompare(saleCredit,contractOutBoundList); } @@ -93,6 +105,11 @@ @Override public InvoicingVo toGetByCompareByVo(SaleCredit saleCredit, List<ContractOutBoundVo> contractOutBoundList) { return getByCompareVo(saleCredit,contractOutBoundList); } @Override public InvoicingVo toGetByCompareByVo1(BillingInfo saleCredit, List<ContractOutBoundVo> contractOutBoundList) { return getByCompareVo1(saleCredit,contractOutBoundList); } /** @@ -416,6 +433,62 @@ return invoicingVo; } private InvoicingVo getByCompareVo1(BillingInfo saleCredit, List<ContractOutBoundVo> contractOutBoundList){ InvoicingVo invoicingVo = new InvoicingVo(); invoicingVo.setSaleCreditId(saleCredit.getId()); invoicingVo.setEntrustCode(saleCredit.getEntrustCode()); //销方 invoicingVo.setTaxNo(saleCredit.getCreditCodeB()); invoicingVo.setLedgerName(saleCredit.getPartyB()); invoicingVo.setOrgCode(saleCredit.getCreditCodeB()); invoicingVo.setFormatGenerate(false); invoicingVo.setIsSplit(false); invoicingVo.setFormatPushType(false); invoicingVo.setTaxUserName(saleCredit.getContactPhoneB()); InvoicingVo.InvoicingVoInfo invoicingVoInfo = new InvoicingVo.InvoicingVoInfo(); invoicingVoInfo.setInvoiceTypeCode("01"); invoicingVoInfo.setSerialNo("MX_ZPP_" + System.currentTimeMillis()); invoicingVoInfo.setDrawer(saleCredit.getContactPhoneB()); Map<String, Object> ext = new HashMap<>(); ext.put("htbh",saleCredit.getContractNo()); invoicingVoInfo.setExt(ext); invoicingVoInfo.setSystemName("xx销售管理信息系统"); List<InvoicingVo.InvoiceDetail> details = new ArrayList<>(); int i = 0; for (ContractOutBound outBoundVo : contractOutBoundList){ i++; InvoicingVo.InvoiceDetail invoiceDetail = new InvoicingVo.InvoiceDetail(); invoiceDetail.setGoodsLineNo(i); invoiceDetail.setGoodsTaxRate(outBoundVo.getTaxRate()); invoiceDetail.setGoodsType(outBoundVo.getSubjectMatterName()); invoiceDetail.setGoodsUnit(outBoundVo.getUnit()); invoiceDetail.setGoodsQuantity(outBoundVo.getOutBoundNum()); invoiceDetail.setGoodsPrice(outBoundVo.getUnitPrice()); invoiceDetail.setGoodsTotalPrice(outBoundVo.getTotalPrice()); invoiceDetail.setGoodsTotalTax(outBoundVo.getTotalTax()); details.add(invoiceDetail); } //购方 invoicingVoInfo.setBuyerTaxNo(saleCredit.getCreditCodeA()); invoicingVoInfo.setBuyerName(saleCredit.getPartyA()); invoicingVoInfo.setInvoiceTotalPrice(saleCredit.getTotalAmount()); //invoicingVoInfo.setInvoiceTotalTax(new BigDecimal(allTax).setScale(2,BigDecimal.ROUND_HALF_UP)); invoicingVoInfo.setInvoiceTotalPriceTax(saleCredit.getTotalTax()); invoicingVoInfo.setBuyerBankName(saleCredit.getBankNameB()); invoicingVoInfo.setBuyerBankNumber(saleCredit.getBankAccountB()); //invoicingVoInfo.setBuyerAddress(.getBuyerAddress()); invoicingVoInfo.setBuyerTelphone(saleCredit.getContactPhoneA()); invoicingVoInfo.setInvoiceDetailsList(details); invoicingVo.setData(invoicingVoInfo); return invoicingVo; } private InvoicingVo getByCompareVo(SaleCredit saleCredit, List<ContractOutBoundVo> contractOutBoundList){ InvoicingVo invoicingVo = new InvoicingVo(); invoicingVo.setSaleCreditId(saleCredit.getId()); @@ -515,6 +588,81 @@ saleCredit.setRedInvoiceResultId(invoiceObj.getId()); saleCredit.setStatus(7); saleCreditService.updateById(saleCredit); return stringObjectMap; }else { InvoicingVo invoicingVo = redKaiPiaoVo(invoiceObj); invoicingVo.setSaleCreditId(saleCredit.getId()); if(invoicingVo !=null){ Map<String, Object> stringObjectMap1 = redTicketKaiPiao(invoicingVo); Boolean confimSuccess1 = (Boolean) stringObjectMap1.get("success"); String message1 = (String) stringObjectMap1.get("message"); if(confimSuccess1){ System.out.println(saleCredit.getEntrustCode()+"的railwayEntrust红字开票结果为:"+confimSuccess1+"------"+message1); return stringObjectMap1; } } } }else { System.out.println(saleCredit.getEntrustCode()+"的红字确认单确认接口异常"); return stringObjectMap; } }else { System.out.println(saleCredit.getEntrustCode()+"的红字确认单新增接口异常"); return objectMap; } }catch (Exception e){ e.printStackTrace(); } System.out.println("异步方法执行完成"); Map<String, Object> result = new HashMap<>(); result.put("success",false); result.put("message","开票异常"); return result; } public Map<String, Object> redTicket1(BillingInfo saleCredit) { System.out.println("进入异步方法"); System.out.println("当前线程名称:" + Thread.currentThread().getName()); try { //红字确认单 InvoiceResult result = invoiceResultService.getById(saleCredit.getBlueInvoiceResultId()); Map<String, Object> objectMap = redTicketConfirm1(result,saleCredit); Boolean success = (Boolean) objectMap.get("success"); if(success){ InvoiceResult obj = (InvoiceResult) objectMap.get("obj"); //红字确认单确认接口 Map<String, Object> stringObjectMap = redTicketConfirmSearch1(obj,saleCredit); Boolean confimSuccess = (Boolean) stringObjectMap.get("success"); if(confimSuccess){ //开票接口 InvoiceResult invoiceObj = (InvoiceResult) stringObjectMap.get("obj"); if(invoiceObj.getConfirmBillingMark().equals("Y")){ //无需开票 System.out.println(saleCredit.getEntrustCode()+"的railwayEntrust已开红字开票"); QueryWrapper<InvoiceResult> invoiceResultQueryWrapper = new QueryWrapper<>(); invoiceResultQueryWrapper.lambda() .eq(InvoiceResult::getEntrustCode,saleCredit.getEntrustCode()) .eq(InvoiceResult::getMethodName,"蓝字开票接口") .like(InvoiceResult::getMessage,"%发票开具成功%"); List<InvoiceResult> list = invoiceResultService.list(invoiceResultQueryWrapper); if(list !=null && list.size()>0){ invoiceResultService.removeByIds(list); } /*UpdateWrapper<RailwayEntrust> updateWrapper = new UpdateWrapper<>(); updateWrapper.lambda().set(RailwayEntrust::getInvoiceResult,null) .set(RailwayEntrust::getInvoiceResultId,null) .set(RailwayEntrust::getInvoiceRemark,"红字开票成功") .set(RailwayEntrust::getInvoiceRedResultId,invoiceObj.getId()) .eq(RailwayEntrust::getEntrustCode,saleCredit.getEntrustCode()); railwayEntrustMapper.update(null,updateWrapper);*/ saleCredit.setInvoiceRemark("红字开票成功"); saleCredit.setRedInvoiceResultId(invoiceObj.getId()); saleCredit.setRedResultStatus(1); billingInfoService.updateById(saleCredit); return stringObjectMap; }else { @@ -1185,6 +1333,152 @@ } /** * 数电红字确认单新增接口 */ Map<String,Object> redTicketConfirm1(InvoiceResult invoiceResult,BillingInfo saleCredit){ String format = strToFormat(invoiceResult.getInvoiceDate()); List<InvoiceResultItem> resultItems = itemMapper.selectList(new LambdaQueryWrapper<InvoiceResultItem>() .eq(InvoiceResultItem::getResultId,invoiceResult.getId()) ); if(saleCredit!=null) { RedConfirmVo confirmVo = new RedConfirmVo(); confirmVo.setTaxNo(saleCredit.getCreditCodeB()); confirmVo.setOrgCode(saleCredit.getCreditCodeB()); confirmVo.setTaxUserName(saleCredit.getContactPhoneB()); confirmVo.setRedConfirmSerialNo("MX_RPP_"+System.currentTimeMillis()); confirmVo.setEntryIdentity("01"); confirmVo.setSellerTaxNo(saleCredit.getCreditCodeB()); confirmVo.setSellerTaxName(saleCredit.getPartyB()); confirmVo.setBuyerTaxName(saleCredit.getPartyA()); confirmVo.setBuyerTaxNo(saleCredit.getCreditCodeA()); confirmVo.setOriginInvoiceIsPaper("N"); confirmVo.setInvoiceSource("2"); confirmVo.setOriginalInvoiceNo(invoiceResult.getInvoiceNo()); confirmVo.setOriginInvoiceDate(format); confirmVo.setOriginInvoiceTotalPrice(invoiceResult.getInvoiceTotalPrice()); confirmVo.setOriginInvoiceTotalTax(invoiceResult.getInvoiceTotalTax()); confirmVo.setOriginInvoiceType("01"); confirmVo.setInvoiceTotalPrice(invoiceResult.getInvoiceTotalPrice()*-1); confirmVo.setInvoiceTotalTax(invoiceResult.getInvoiceTotalTax()*-1); confirmVo.setRedInvoiceLabel("02"); confirmVo.setAutoIssueSwitch("N"); List<RedConfirmVo.RedConfirmDetail> detailList = new ArrayList<>(); for (InvoiceResultItem resultItem : resultItems) { RedConfirmVo.RedConfirmDetail detail = new RedConfirmVo.RedConfirmDetail(); detail.setOriginalInvoiceDetailNo(resultItem.getGoodsLineNo()); detail.setGoodsLineNo(resultItem.getGoodsLineNo()); detail.setGoodsCode(resultItem.getGoodsCode()); detail.setGoodsTaxRate(resultItem.getGoodsTaxRate()); detail.setGoodsName(resultItem.getCoalName()); detail.setProjectName(resultItem.getCoalName()); detail.setGoodsPrice(resultItem.getGoodsPrice()+""); detail.setGoodsSpecification(resultItem.getGoodsSpecification()); detail.setGoodsUnit(resultItem.getGoodsUnit()); detail.setGoodsQuantity(resultItem.getGoodsQuantity()*-1+""); detail.setGoodsTotalPrice(resultItem.getGoodsTotalPrice()*-1); detail.setGoodsTotalTax(resultItem.getGoodsTotalTax()*-1); detail.setCoalType(resultItem.getCoalType()); detail.setAgreementTerm(resultItem.getAgreementTerm()); detailList.add(detail); } confirmVo.setRedConfirmDetailReqEntityList(detailList); Gson gson =new Gson(); String str = gson.toJson(confirmVo); System.out.println(str); String responseBody = ""; responseBody = HttpRequest.post(invoiceIp+redConfirmUrl+ UuidUtils.generateUuid()) .timeout(400000) .body(str) .execute() .body(); System.out.println(responseBody); JSONObject jsonObj = JSON.parseObject(responseBody); if(jsonObj!=null) { boolean flag = (Boolean) jsonObj.get("success"); JSONObject message = jsonObj.getJSONObject("message"); String requestId = (String) jsonObj.get("requestId"); if (!flag) { Map<String,Object> res = new HashMap<>(); res.put("success",flag); res.put("message",message.get("errorMessage")); InvoiceResult result = new InvoiceResult(); result.setRequestId(requestId); result.setSuccess(flag); result.setMessage((String) message.get("errorMessage")); result.setMethodName("红字确认单新增接口"); result.setEntrustCode(saleCredit.getEntrustCode()); invoiceResultService.save(result); saleCredit.setInvoiceRemark((String) message.get("errorMessage")); billingInfoService.updateById(saleCredit); return res; } else { String successMessage = (String) message.get("successMessage"); JSONArray modelarr = jsonObj.getJSONArray("model"); JSONObject model = modelarr.getJSONObject(0); String redConfirmSerialNo = (String)model.get("redConfirmSerialNo"); String redConfirmNo = (String)model.get("redConfirmNo"); String redConfirmUuid = (String)model.get("redConfirmUuid"); String confirmState = (String)model.get("confirmState"); String confirmBillingMark = (String)model.get("confirmBillingMark"); InvoiceResult result = new InvoiceResult(); result.setXTaxNo(invoiceResult.getXTaxNo()); result.setRequestId(requestId); result.setSuccess(flag); result.setMessage(successMessage); result.setSerialNo(redConfirmSerialNo); result.setInvoiceNo(redConfirmNo); result.setRedConfirmUuid(redConfirmUuid); result.setConfirmState(confirmState); result.setConfirmBillingMark(confirmBillingMark); result.setMethodName("红字确认单新增接口"); result.setOriginalInvoiceNo(invoiceResult.getInvoiceNo()); result.setEntrustCode(invoiceResult.getEntrustCode()); invoiceResultService.save(result); Map<String,Object> res = new HashMap<>(); res.put("success",flag); res.put("message",successMessage); res.put("obj",result); return res; } }else { Map<String,Object> res = new HashMap<>(); res.put("success",false); res.put("message","开票接口异常"); InvoiceResult result = new InvoiceResult(); result.setSuccess(false); result.setMessage("红字确认单新增接口异常"); result.setMethodName("红字确认单新增接口"); result.setEntrustCode(saleCredit.getEntrustCode()); invoiceResultService.save(result); saleCredit.setInvoiceRemark("红字确认单新增接口异常"); billingInfoService.updateById(saleCredit); return res; } }else { Map<String,Object> res = new HashMap<>(); res.put("success",false); res.put("message","红字确认单新增接口异常"); InvoiceResult result = new InvoiceResult(); result.setSuccess(false); result.setMessage("红字确认单新增接口异常"); result.setMethodName("红字确认单新增接口"); result.setEntrustCode(saleCredit.getEntrustCode()); invoiceResultService.save(result); saleCredit.setInvoiceRemark("红字确认单新增接口异常"); billingInfoService.updateById(saleCredit); return res; } } /** * 数电红字确认单查询接口 */ Map<String,Object> redTicketConfirmSearch(InvoiceResult invoiceResult,SaleCredit saleCredit){ @@ -1405,6 +1699,226 @@ } /** * 数电红字确认单查询接口 */ Map<String,Object> redTicketConfirmSearch1(InvoiceResult invoiceResult,BillingInfo saleCredit){ /* QueryWrapper<RailwayEntrust> wrapper = new QueryWrapper<>(); wrapper.lambda().eq(RailwayEntrust::getEntrustCode,invoiceResult.getEntrustCode()); RailwayEntrust railwayEntrust = railwayEntrustMapper.selectList(wrapper).get(0);*/ Map<String,Object> map = new HashMap<>(); map.put("taxNo",invoiceResult.getXTaxNo()); //map.put("taxUserName",dwuser); map.put("sellerTaxNo",invoiceResult.getXTaxNo()); map.put("redConfirmUuid",invoiceResult.getRedConfirmUuid()); Gson gson =new Gson(); String str = gson.toJson(map); System.out.println(str); String responseBody = ""; responseBody = HttpRequest.post(invoiceIp+redConfirmSearchUrl+UuidUtils.generateUuid()) .timeout(400000) .body(str) .execute() .body(); System.out.println(responseBody); JSONObject jsonObj = JSON.parseObject(responseBody); if(jsonObj!=null) { boolean flag = (Boolean) jsonObj.get("success"); JSONObject message = jsonObj.getJSONObject("message"); String requestId = (String) jsonObj.get("requestId"); if (!flag) { Map<String,Object> res = new HashMap<>(); res.put("success",false); res.put("message","红字确认单确认接口异常"); InvoiceResult result = new InvoiceResult(); result.setSuccess(false); result.setRequestId(requestId); result.setMessage("红字确认单确认接口异常"); result.setMethodName("红字确认单确认接口"); result.setEntrustCode(invoiceResult.getEntrustCode()); invoiceResultService.save(result); saleCredit.setInvoiceRemark("红字确认单确认接口异常"); billingInfoService.updateById(saleCredit); return res; } else { String successMessage = (String) message.get("successMessage"); JSONArray modelarr = jsonObj.getJSONArray("model"); JSONObject model = modelarr.getJSONObject(0); String redConfirmSerialNo = (String)model.get("redConfirmSerialNo"); String redConfirmNo = (String)model.get("redConfirmNo"); String redConfirmUuid = (String)model.get("redConfirmUuid"); String confirmState = (String)model.get("confirmState"); String confirmBillingMark = (String)model.get("confirmBillingMark"); String entryIdentity = (String)model.get("entryIdentity"); String sellerTaxNo = (String)model.get("sellerTaxNo"); String sellerName = (String)model.get("sellerName"); String buyerTaxNo = (String)model.get("buyerTaxNo"); String buyerName = (String)model.get("buyerName"); String originalInvoiceNo = (String)model.get("originalInvoiceNo"); String originInvoiceIsPaper = (String)model.get("originInvoiceIsPaper"); String originInvoiceDate = (String)model.get("originInvoiceDate"); String originInvoiceType = (String)model.get("originInvoiceType"); String redInvoiceLabel = (String)model.get("redInvoiceLabel"); String alreadyRedInvoiceFlag = (String)model.get("alreadyRedInvoiceFlag"); String redInvoiceNo = (String)model.get("redInvoiceNo"); String redInvoiceDate = (String)model.get("redInvoiceDate"); String entryDate = (String)model.get("entryDate"); String validFlag = (String)model.get("validFlag"); String invoiceSource = (String)model.get("invoiceSource"); String tenantCode = (String)model.get("tenantCode"); String orgCode = (String)model.get("orgCode"); String buySelSelector = (String)model.get("buySelSelector"); String autoIssueSwitch = (String)model.get("autoIssueSwitch"); String priceTaxMark = (String)model.get("priceTaxMark"); BigDecimal originInvoiceTotalPriceValue = (BigDecimal) model.get("originInvoiceTotalPrice"); Double originInvoiceTotalPrice = Double.valueOf(originInvoiceTotalPriceValue.doubleValue()); BigDecimal originInvoiceTotalTaxValue = (BigDecimal) model.get("originInvoiceTotalTax"); Double originInvoiceTotalTax = Double.valueOf(originInvoiceTotalTaxValue.doubleValue()); BigDecimal invoiceTotalPriceValue = (BigDecimal) model.get("invoiceTotalPrice"); Double invoiceTotalPrice = Double.valueOf(invoiceTotalPriceValue.doubleValue()); BigDecimal invoiceTotalTaxValue = (BigDecimal) model.get("invoiceTotalTax"); Double invoiceTotalTax = Double.valueOf(invoiceTotalTaxValue.doubleValue()); InvoiceResult result = new InvoiceResult(); result.setRequestId(requestId); result.setMessage(successMessage); result.setSerialNo(redConfirmSerialNo); result.setInvoiceNo(redConfirmNo); result.setSuccess(flag); result.setInvoiceNo(invoiceResult.getInvoiceNo()); result.setEntrustCode(invoiceResult.getEntrustCode()); result.setXTaxNo(sellerTaxNo); result.setXOrgCode(orgCode); result.setXName(sellerName); result.setGName(buyerName); result.setGTaxNo(buyerTaxNo); result.setEntryDate(entryDate); result.setEntryIdentity(entryIdentity); result.setAlreadyRedInvoiceFlag(alreadyRedInvoiceFlag); result.setOriginInvoiceType(originInvoiceType); result.setOriginalInvoiceDate(originInvoiceDate); result.setOriginInvoiceIsPaper(originInvoiceIsPaper); result.setOriginalInvoiceNo(originalInvoiceNo); result.setRedInvoiceNo(redInvoiceNo); result.setRedInvoiceDate(redInvoiceDate); result.setValidFlag(validFlag); result.setRedInvoiceLabel(redInvoiceLabel); result.setRedConfirmUuid(redConfirmUuid); result.setConfirmState(confirmState); result.setConfirmBillingMark(confirmBillingMark); result.setMethodName("红字确认单确认接口"); result.setInvoiceTotalPrice(invoiceTotalPrice); result.setInvoiceTotalTax(invoiceTotalTax); result.setOriginInvoiceTotalPrice(originInvoiceTotalPrice); result.setOriginInvoiceTotalTax(originInvoiceTotalTax); invoiceResultService.save(result); JSONArray invoiceDetailList1 = model.getJSONArray("electricInvoiceDetails"); for (int i = 0; i < invoiceDetailList1.size(); i++) { JSONObject jsonObject = invoiceDetailList1.getJSONObject(i); int goodsLineNo = (int) jsonObject.get("goodsLineNo"); int originalInvoiceDetailNo = (int) jsonObject.get("originalInvoiceDetailNo"); String goodsName = (String) jsonObject.get("goodsName"); String goodsCode = (String) jsonObject.get("goodsCode"); BigDecimal goodsPriceValue = (BigDecimal)jsonObject.get("goodsPrice"); Double goodsPrice = Double.valueOf(goodsPriceValue.doubleValue()); double goodsQuantity=0.0; try { BigDecimal goodsQuantityValue = (BigDecimal)jsonObject.get("goodsQuantity"); goodsQuantity = Double.valueOf(goodsQuantityValue.doubleValue()); }catch (Exception e){ e.printStackTrace(); int goodsQuantity1 = (int) jsonObject.get("goodsQuantity"); goodsQuantity = goodsQuantity1; } BigDecimal goodsTotalPriceValue = (BigDecimal)jsonObject.get("goodsTotalPrice"); Double goodsTotalPrice = Double.valueOf(goodsTotalPriceValue.doubleValue()); BigDecimal goodsTotalTaxValue = (BigDecimal)jsonObject.get("goodsTotalTax"); Double goodsTotalTax = Double.valueOf(goodsTotalTaxValue.doubleValue()); BigDecimal goodsTaxRateValue = (BigDecimal)jsonObject.get("goodsTaxRate"); Double goodsTaxRate = Double.valueOf(goodsTaxRateValue.doubleValue()); String invoiceLineNature = (String) jsonObject.get("invoiceLineNature"); String goodsUnit = (String) jsonObject.get("goodsUnit"); String goodsSpecification = (String) jsonObject.get("goodsSpecification"); String coalType = (String)jsonObject.get("coalType"); String agreementTerm = (String)jsonObject.get("agreementTerm"); String name = ""; if(goodsLineNo==1){ name = "煤款"; } if(goodsLineNo==2){ name = "取送车费"; } if(goodsLineNo==3){ name = "专线费"; } InvoiceResultItem item = new InvoiceResultItem(); item.setGoodsLineNature(invoiceLineNature); item.setOriginalInvoiceDetailNo(originalInvoiceDetailNo); item.setGoodsCode(goodsCode); item.setGoodsPrice(goodsPrice); item.setGoodsType(name); if(goodsSpecification !=null){ item.setGoodsSpecification(goodsSpecification); } item.setGoodsLineNo(goodsLineNo); item.setGoodsQuantity(goodsQuantity); item.setGoodsTaxRate(goodsTaxRate); item.setGoodsName(goodsName); item.setGoodsTotalPrice(goodsTotalPrice); item.setGoodsTotalTax(goodsTotalTax); item.setGoodsUnit(goodsUnit); item.setResultId(result.getId()); item.setEntrustCode(result.getEntrustCode()); if(coalType !=null){ item.setCoalType(coalType); } if(agreementTerm !=null){ item.setAgreementTerm(agreementTerm); } String[] split = goodsName.split("\\*"); int length = split.length; String coalName = split[length - 1]; item.setCoalName(coalName); itemMapper.insert(item); } Map<String,Object> res = new HashMap<>(); res.put("success",flag); res.put("message",successMessage); res.put("obj",result); saleCredit.setInvoiceRemark("红字确认单确认接口成功"); saleCredit.setRedInvoiceResultId(result.getId()); billingInfoService.updateById(saleCredit); return res; } }else { Map<String,Object> res = new HashMap<>(); res.put("success",false); res.put("message","红字确认单确认接口异常"); InvoiceResult result = new InvoiceResult(); result.setSuccess(false); result.setMessage("红字确认单确认接口异常"); result.setMethodName("红字确认单确认接口"); result.setEntrustCode(invoiceResult.getEntrustCode()); invoiceResultService.save(result); saleCredit.setInvoiceRemark("红字确认单确认接口异常"); billingInfoService.updateById(saleCredit); return res; } } /** * 红字确认单form * @param result * @return platformx-business-finance-biz/src/main/resources/mapper/BillingInfoMapper.xml
New file @@ -0,0 +1,50 @@ <?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.by4cloud.platformx.business.mapper.BillingInfoMapper"> <resultMap id="billingInfoMap" type="com.by4cloud.platformx.business.entity.BillingInfo"> <id property="id" column="id"/> <result property="contractId" column="contract_id"/> <result property="contractName" column="contract_name"/> <result property="contractNo" column="contract_no"/> <result property="partyAId" column="party_a_id"/> <result property="partyA" column="party_a"/> <result property="creditCodeA" column="credit_code_a"/> <result property="bankNameA" column="bank_name_a"/> <result property="bankAccountA" column="bank_account_a"/> <result property="contactPhoneA" column="contact_phone_a"/> <result property="partyBId" column="party_b_id"/> <result property="partyB" column="party_b"/> <result property="creditCodeB" column="credit_code_b"/> <result property="bankNameB" column="bank_name_b"/> <result property="bankAccountB" column="bank_account_b"/> <result property="contactPhoneB" column="contact_phone_b"/> <result property="entrustCode" column="entrust_code"/> <result property="billingType" column="billing_type"/> <result property="matterStr" column="matter_str"/> <result property="blueInvoiceId" column="blue_invoice_id"/> <result property="blueInvoiceResultId" column="blue_invoice_result_id"/> <result property="blueInvoiceTime" column="blue_invoice_time"/> <result property="invoicePath" column="invoice_path"/> <result property="invoiceBlueUrl" column="invoice_blue_url"/> <result property="bipStatus" column="bip_status"/> <result property="blueResultStatus" column="blue_result_status"/> <result property="invoiceRedPath" column="invoice_red_path"/> <result property="invoiceRedUrl" column="invoice_red_url"/> <result property="invoiceRemark" column="invoice_remark"/> <result property="redInvoiceResultId" column="red_invoice_result_id"/> <result property="redInvoiceTime" column="red_invoice_time"/> <result property="redResultStatus" column="red_result_status"/> <result property="status" column="status"/> <result property="totalAmount" column="total_amount"/> <result property="totalTax" column="total_tax"/> <result property="amountNoTax" column="amount_no_tax"/> <result property="compId" column="comp_id"/> <result property="createBy" column="create_by"/> <result property="createTime" column="create_time"/> <result property="updateBy" column="update_by"/> <result property="updateTime" column="update_time"/> <result property="delFlag" column="del_flag"/> </resultMap> </mapper> platformx-business-finance-biz/src/main/resources/mapper/BillingItemMapper.xml
New file @@ -0,0 +1,34 @@ <?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.by4cloud.platformx.business.mapper.BillingItemMapper"> <resultMap id="billingItemMap" type="com.by4cloud.platformx.business.entity.BillingItem"> <id property="id" column="id"/> <result property="compId" column="comp_id"/> <result property="billingInfoId" column="billing_info_id"/> <result property="billingStatus" column="billing_status"/> <result property="busGuestId" column="bus_guest_id"/> <result property="contractId" column="contract_id"/> <result property="contractOutBoundIds" column="contract_out_bound_ids"/> <result property="invoiceName" column="invoice_name"/> <result property="productId" column="product_id"/> <result property="productNum" column="product_num"/> <result property="specification" column="specification"/> <result property="subjectMatterCode" column="subject_matter_code"/> <result property="subjectMatterName" column="subject_matter_name"/> <result property="taxClass" column="tax_class"/> <result property="taxCode" column="tax_code"/> <result property="taxRate" column="tax_rate"/> <result property="totalPrice" column="total_price"/> <result property="totalTax" column="total_tax"/> <result property="totalPriceNoTax" column="total_price_no_tax"/> <result property="unit" column="unit"/> <result property="unitPrice" column="unit_price"/> <result property="createBy" column="create_by"/> <result property="createTime" column="create_time"/> <result property="updateBy" column="update_by"/> <result property="updateTime" column="update_time"/> <result property="delFlag" column="del_flag"/> </resultMap> </mapper>