shiyunteng
2 天以前 a0974f04b5a83e3ab152ce79e53f180e7b496165
fix:发票管理模块
23个文件已修改
60个文件已删除
17个文件已添加
1 文件已重命名
10729 ■■■■ 已修改文件
platformx-boot/src/main/resources/application-dev.yml 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-boot/src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/constant/FlowNameEnum.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractAddDTO.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractSubjectMatterAddDTO.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/GenInvoiceInfoDTO.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BillingInfo.java 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BillingItem.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BwRequestRecord.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Contract.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractInvoice.java 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractOutBound.java 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractSubjectMatter.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/SaleCredit.java 180 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipInvoice.java 233 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/FileBip.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResult.java 215 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResultItem.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BIPBody.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BIPPayPlan.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BIPYs.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BIPYsItem.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BIPYsMx.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BIPYsMxHeader.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BipResVo.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BipTokenVo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/InvoicingVo.java 291 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/RedConfirmVo.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractDetailVo.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractInvoiceOutBoundVo.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundMergeVo.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundVo.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/GenInvoiceInfoVo.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/InvoiceItemVo.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/pom.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/BillingInfoController.java 317 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/BillingItemController.java 119 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/BusinessCustomerController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractBillingController.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractController.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractInvoiceController.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/FlowCallBackController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/InvoiceResultController.java 375 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ProductController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/SaleCreditController.java 465 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/controller/FpInvoiceResultController.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/BipInvoiceMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FileBipMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FpInvoiceResultItemMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FpInvoiceResultMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/BIPYsService.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/BipInvoiceService.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FileBipService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FileUploadService.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FpInvoiceResultItemService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FpInvoiceResultService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/BIPYsServiceImpl.java 1699 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/BipInvoiceServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FileBipServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FileUploadServiceImpl.java 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FpInvoiceResultItemServiceImpl.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FpInvoiceResultServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/BipApiEnum.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/BipHttpUtil.java 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/NumUtils.java 305 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/BillingInfoMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/BillingItemMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/BwRequestRecordMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractInvoiceMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/SaleCreditMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/BillingInfoService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/BillingItemService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/BusinessCustomerService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractInvoiceService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/InvoiceService.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/PaymentConfirmService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ProductService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/SaleCreditService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BillingInfoServiceImpl.java 235 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BillingItemServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractInvoiceServiceImpl.java 649 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java 317 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/InvoiceServiceImpl.java 2035 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/PaymentConfirmServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ProductServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/SaleCreditServiceImpl.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/BillingInfoMapper.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/BillingItemMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/BipInvoiceMapper.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/BwRequestRecordMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/ContractInvoiceMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/FileBipMapper.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/FpInvoiceResultItemMapper.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/FpInvoiceResultMapper.xml 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/mapper/SaleCreditMapper.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/template/ymj/ymjcght.docx 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/template/ymj/ymjgkcpmmht.docx 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/template/ymj/ymjgypmmht.docx 补丁 | 查看 | 原始文档 | blame | 历史
platformx-business-finance-biz/src/main/resources/template/ymj/ymjjgclht.docx 补丁 | 查看 | 原始文档 | blame | 历史
platformx-boot/src/main/resources/application-dev.yml
@@ -2,7 +2,6 @@
  data:
    redis:
      host: 127.0.0.1
      #password: 123456
      database: 0
  # 数据库相关配置
  datasource:
@@ -45,23 +44,15 @@
#bip 配置
bip:
  url: ''
  flag: false
  url: https://bip01.res.jzeg.cn
  codes: 111111111111111111111111,222222222222222222
  ip: https://bip01.res.jzeg.cn/
  filePath: D:\test\
  fontPath: /Users/kongdeqiang/Desktop/SIMSUN.TTC
  appKey: 800b2805c5584f0abb8705acbe487dc5
  appSecret: 59ba72c62a6a27203d7e517787a738be89ba55cb
BWInvoice:
  ip: https://einv01.res.jzeg.cn/post
  kaipiao: ?method=baiwang.output.invoice.issue&version=1.0&requestId=
  chaxun: ?method=baiwang.output.format.query&version=1.0&request_id=
  redConfirmAdd: ?method=baiwang.output.redinvoice.add&version=1.0&requestId=
  redConfirmSearch: ?method=baiwang.output.redinvoice.formlist&version=1.0&requestId=
  search: ?method=baiwang.input.invoice.queryinvoicepool&version=1.0&requestId=
  bind: ?method=baiwang.image.invoices.invoicemanageadd&version=1.0&requestId=
  ocr: ?baiwang.image.invoices.recogcollect&version=1.0&requestId=
  flag: false
  url: https://einv01.res.jzeg.cn/post?
# 5家单位id
dept:
platformx-boot/src/main/resources/application.yml
@@ -1,10 +1,10 @@
server:
  port: 8888    # 项目端口
  port: 8899    # 项目端口
  servlet:
    context-path: /business  # 项目访问路径
servers:
  main-url: http://127.0.0.1:9999/admin
  business-url: http://127.0.0.1:8888/business
  business-url: http://127.0.0.1:8899/business
spring:
  application:
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/constant/FlowNameEnum.java
@@ -12,7 +12,8 @@
@AllArgsConstructor
public enum FlowNameEnum {
    合同审批("合同审批"),
    排产计划审批("排产计划审批");
    排产计划审批("排产计划审批"),
    销售挂账审批("销售挂账审批");
    private String name;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractAddDTO.java
@@ -87,6 +87,61 @@
    @Schema(description = "执行日期后多少天生成应收")
    private Integer execDay;
    @Schema(description = "环境")
    private String environment;
    @Schema(description = "标准")
    private String standard;
    @Schema(description = "质保期 使用月数")
    private BigDecimal useMonth;
    @Schema(description = "质保期 发货后月数")
    private BigDecimal afterShipMonth;
    @Schema(description = "货运方式")
    private String shipMethod;
    @Schema(description = "货运地址")
    private String shipAddress;
    @Schema(description = "包装")
    private String packaging;
    @Schema(description = "维修或换货期限")
    private BigDecimal repairPeriod;
    @Schema(description = "维修或换货 违约金")
    private BigDecimal repairBreachAmount;
    @Schema(description = "货物数量不足 补货天数")
    private BigDecimal goodsShort;
    @Schema(description = "货物数量不足 违约金")
    private BigDecimal goodsShortBreachAmount;
    @Schema(description = "每逾期一日,承担本合同总额 违约金")
    private BigDecimal overdueBreachAmount;
    @Schema(description = "逾期  日以上的,甲方有权解除合同")
    private BigDecimal terminateContract;
    @Schema(description = "双方均可向 人民法院")
    private String court;
    @Schema(description = "本合同附件包括:")
    private String contractAttchment;
    @Schema(description = "合同签订市")
    private String city;
    @Schema(description = "合同签订区")
    private String region;
    @Schema(description = "开票通知在 个工作日内")
    private BigDecimal invoiceNotice;
    private List<ContractPaymentScheduleAddDTO> contractPaymentSchedule;
    private List<ContractSubjectMatterAddDTO> contractSubjectMatter;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/ContractSubjectMatterAddDTO.java
@@ -1,15 +1,17 @@
package com.by4cloud.platformx.business.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class ContractSubjectMatterAddDTO {
    @Column(columnDefinition = "VARCHAR(200) comment '标的物名称'")
    @Schema(description = "标的物名称")
    private String materialName;
    @Schema(description = "标的物编码(内部唯一编码)")
@@ -48,4 +50,12 @@
    @Schema(description = "总重")
    private BigDecimal totalWight;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "计划交付日期")
    private Date plannedDeliveryDate;
    @Schema(description = "备注")
    private String remarks;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/GenInvoiceInfoDTO.java
New file
@@ -0,0 +1,12 @@
package com.by4cloud.platformx.business.dto;
import lombok.Data;
import java.util.List;
@Data
public class GenInvoiceInfoDTO {
    private List<Long> contractOutBoundIds;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BillingInfo.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BillingItem.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BwRequestRecord.java
New file
@@ -0,0 +1,39 @@
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.Table;
/**
 * 时间
 * syt
 */
@Data
@Entity//加了才能自动生成表
@Table(appliesTo="bw_request_record",comment = "bw请求记录")//给表加注释
@jakarta.persistence.Table(name = "bw_request_record")//数据库创建的表明
public class BwRequestRecord extends BaseModel<BwRequestRecord> {
    @Schema(description = "接口名称")
    @Column(columnDefinition="VARCHAR(128) comment '接口名称'")
    private String interfaceName;
    @Schema(description = "接口名称")
    @Column(columnDefinition="VARCHAR(128) comment '接口名称'")
    private String requestId;
    @Schema(description = "请求唯一标识")
    @Column(columnDefinition="VARCHAR(64) comment '请求唯一标识'")
    private String requestParams;
    @Schema(description = "回参")
    @Column(columnDefinition="text comment '回参'")
    private String responseParams;
    @Schema(description = "结果码")
    @Column(columnDefinition="VARCHAR(32) comment '结果码'")
    private String responseCode;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/Contract.java
@@ -175,6 +175,78 @@
    @Column(columnDefinition = "int comment '执行日期后多少天生成应收'")
    private Integer execDay;
    @Schema(description = "环境")
    @Column(columnDefinition = "VARCHAR(128) comment '环境 一煤机采购合同用'")
    private String environment;
    @Schema(description = "标准")
    @Column(columnDefinition = "VARCHAR(128) comment '标准 一煤机采购合同用'")
    private String standard;
    @Schema(description = "质保期 使用月数")
    @Column(columnDefinition = "decimal(10,0) comment '质保期 使用月数 一煤机采购合同用'")
    private BigDecimal useMonth;
    @Schema(description = "质保期 发货后月数")
    @Column(columnDefinition = "decimal(10,0) comment '质保期 发货后月数 一煤机采购合同用'")
    private BigDecimal afterShipMonth;
    @Schema(description = "货运方式")
    @Column(columnDefinition = "VARCHAR(128) comment '货运方式 一煤机采购合同用'")
    private String shipMethod;
    @Schema(description = "货运地址")
    @Column(columnDefinition = "VARCHAR(128) comment '货运地址 一煤机采购合同用'")
    private String shipAddress;
    @Schema(description = "包装")
    @Column(columnDefinition = "VARCHAR(128) comment '包装 一煤机采购合同用'")
    private String packaging;
    @Schema(description = "维修或换货期限")
    @Column(columnDefinition = "decimal(10,0) comment '维修或换货期限 一煤机采购合同用'")
    private BigDecimal repairPeriod;
    @Schema(description = "维修或换货 违约金")
    @Column(columnDefinition = "decimal(10,2) comment '维修或换货 违约金 一煤机采购合同用'")
    private BigDecimal repairBreachAmount;
    @Schema(description = "货物数量不足 补货天数")
    @Column(columnDefinition = "decimal(10,0) comment '货物数量不足 补货天数 一煤机采购合同用'")
    private BigDecimal goodsShort;
    @Schema(description = "货物数量不足 违约金")
    @Column(columnDefinition = "decimal(10,2) comment '货物数量不足 补货天数 一煤机采购合同用'")
    private BigDecimal goodsShortBreachAmount;
    @Schema(description = "每逾期一日,承担本合同总额 违约金")
    @Column(columnDefinition = "decimal(10,2) comment '每逾期一日,承担本合同总额违约金 补货天数 一煤机采购合同用'")
    private BigDecimal overdueBreachAmount;
    @Schema(description = "逾期  日以上的,甲方有权解除合同")
    @Column(columnDefinition = "decimal(10,0) comment '逾期  日以上的,甲方有权解除合同 一煤机采购合同用'")
    private BigDecimal terminateContract;
    @Schema(description = "双方均可向 人民法院")
    @Column(columnDefinition = "VARCHAR(128) comment '双方均可向 人民法院 一煤机采购合同用'")
    private String court;
    @Schema(description = "本合同附件包括:")
    @Column(columnDefinition = "VARCHAR(128) comment '本合同附件包括: 一煤机采购合同用'")
    private String contractAttchment;
    @Schema(description = "合同签订市")
    @Column(columnDefinition = "VARCHAR(128) comment '合同签订市 一煤机采购合同用'")
    private String city;
    @Schema(description = "合同签订区")
    @Column(columnDefinition = "VARCHAR(128) comment '合同签订区 一煤机采购合同用'")
    private String region;
    @Schema(description = "开票通知在 个工作日内")
    @Column(columnDefinition = "decimal(10,0) comment '开票通知在 个工作日内 一煤机采购合同用'")
    private BigDecimal invoiceNotice;
    /**
     * 临时字段 - 用于接收审批人名称等关联查询结果
     */
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractInvoice.java
New file
@@ -0,0 +1,108 @@
package com.by4cloud.platformx.business.entity;
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 lombok.Data;
import org.hibernate.annotations.Table;
import java.math.BigDecimal;
import java.util.Date;
/**
 * 2026年6月5日 10:59:02
 * syt
 */
@Data
@Entity//加了才能自动生成表
@Table(appliesTo="contract_invoice",comment = "合同发票")//给表加注释
@jakarta.persistence.Table(name = "contract_invoice")//数据库创建的表明
public class ContractInvoice extends BaseModel<ContractInvoice> {
    @Schema(description = "关联合同ID")
    @Column(columnDefinition = "bigint not null comment '关联合同ID'")
    private Long contractId;
    @Schema(description = "发票类型")
    @Column(columnDefinition="char comment '发票类型 1/蓝 2/红'")
    private String invoiceCategory;
    @Schema(description = "开票金额(不含税)")
    @Column(columnDefinition="decimal(10,2) comment '开票金额(含税'")
    private BigDecimal invoiceTotalPrice;
    @Schema(description = "开票税额")
    @Column(columnDefinition="decimal(10,2) comment '开票税额'")
    private BigDecimal invoiceTotalTax;
    @Schema(description = "开票金额(含税)")
    @Column(columnDefinition="decimal(10,2) comment '开票金额(含税)'")
    private BigDecimal invoiceTotalPriceTax;
    @Schema(description = "开票时间")
    @Column(columnDefinition="datetime comment '开票时间'")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date invoiceTime;
    @Schema(description = "发票状态")
    @Column(columnDefinition="char comment '发票状态 1/开票中 2/已开票'")
    private String invoiceStatus;
    @Schema(description = "发票地址")
    @Column(columnDefinition="varchar(256) comment '开票时间'")
    private String invoicePath;
    @Schema(description = "合同出库单ID")
    @Column(columnDefinition="text comment '合同出库单ID'")
    private String outBoundId;
    @Schema(description = "红冲标识")
    @Column(columnDefinition="char comment '红冲标识 1/是 0/否 2/审核中 3/红冲待确认'")
    private String redReversal;
    @Schema(description = "发票号码")
    @Column(columnDefinition="varchar(64) comment '开票流水号'")
    private String invoiceNo;
    @Schema(description = "开票流水号")
    @Column(columnDefinition="varchar(64) comment '开票流水号'")
    private String serialNo;
    @Schema(description = "机构税号")
    @Column(columnDefinition="varchar(64) comment '机构税号'")
    private String texNo;
    @Schema(description = "销售方名称")
    @Column(columnDefinition="varchar(128) comment '销售方名称'")
    private String sellerTaxName;
    @Schema(description = "购买方名称")
    @Column(columnDefinition="varchar(128) comment '购买方名称'")
    private String buyerTaxName;
    @Schema(description = "发票预览信息")
    @Column(columnDefinition="text comment '发票预览信息'")
    private String invoicePreview;
    @Schema(description = "审批状态")
    @Column(columnDefinition="char comment '审批状态 1/审批通过 0/审批中 2/审批失败'")
    private String approvalStatus;
    @Schema(description = "关联蓝票ID")
    @Column(columnDefinition = "bigint comment '关联蓝票ID'")
    private Long blueInvoiceId;
    @Schema(description = "bip推送标识")
    @Column(columnDefinition="char comment 'bip推送标识 1/已推送 0/未推送'")
    private String bipPush;
    @Schema(description = "bip推送成功后返回数据ID")
    @Column(columnDefinition="bigint comment 'bip推送标识 1/已推送 0/未推送'")
    private Long bipId;
    @Schema(description = "发票预览bip推送成功后返回的数据结构")
    @Column(columnDefinition="text comment '发票预览信息'")
    private String bipBody;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/ContractOutBound.java
@@ -79,58 +79,59 @@
    @Column(columnDefinition="text comment '到货单据路径'")
    private String arrivalAttPaths;
    //以下开票相关
    @Schema(description = "结算id")
    @Column(columnDefinition = "bigint default null comment '结算id'")
    private Long saleCreditId;
    @Schema(description = "开票状态(0-未开票 1-开票中 2-已开票)")
    @Column(columnDefinition = "tinyint(2) default 0 comment '开票状态(0-未开票 1-开票中 2-已开票)'")
    private Integer invoiceSatus;
    @Column(columnDefinition = "char default 0 comment '开票状态(0-未开票 1-开票中 2-已开票)'")
    private String invoiceStatus;
    @Schema(description = "总单价")
    @Column(columnDefinition = "decimal(10,0) comment '总单价'")
    private BigDecimal totalPrice;
//    //以下开票相关
//
//    @Schema(description = "结算id")
//    @Column(columnDefinition = "bigint default null comment '结算id'")
//    private Long saleCreditId;
//
    @Schema(description = "总税额")
    @Column(columnDefinition = "decimal(10,0) comment '总税额'")
    private BigDecimal totalTax;
    //产品信息
    @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;
//
//    @Schema(description = "总单价")
//    @Column(columnDefinition = "decimal(10,0) comment '总单价'")
//    private BigDecimal totalPrice;
//
//    @Schema(description = "总税额")
//    @Column(columnDefinition = "decimal(10,0) comment '总税额'")
//    private BigDecimal totalTax;
//
//    //产品信息
//
//    @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/entity/ContractSubjectMatter.java
@@ -100,11 +100,11 @@
    @Column(columnDefinition = "VARCHAR(500) comment '交货/交付地点'")
    private String deliveryPlace;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Schema(description = "计划交付日期")
    @Column(columnDefinition = "VARCHAR(64) comment '计划交付日期'")
    private String plannedDeliveryDate;
    @Column(columnDefinition = "date comment '计划交付日期'")
    private Date plannedDeliveryDate;
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
@@ -181,4 +181,9 @@
    @Schema(description = "总重")
    @Column(columnDefinition = "decimal(10,2) comment '总重 /kg'")
    private BigDecimal totalWight;
    @Schema(description = "备注")
    @Column(columnDefinition="text comment '备注'")
    private String remarks;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/SaleCredit.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/BipInvoice.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/FileBip.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResult.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/InvoiceResultItem.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BIPBody.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BIPPayPlan.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BIPYs.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BIPYsItem.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BIPYsMx.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BIPYsMxHeader.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BipResVo.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/BipTokenVo.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/InvoicingVo.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/invoice/vo/RedConfirmVo.java
File was deleted
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractDetailVo.java
@@ -17,12 +17,18 @@
    @Schema(description = "合同名称")
    private String contractName;
    @Schema(description = "合同名称")
    private String contractNo;
    @Schema(description = "甲方id")
    private Long partyAId;
    @Schema(description = "甲方名称")
    private String partyA;
    @Schema(description = "甲方税号")
    private String partyAOrgCode;
    @Schema(description = "乙方id")
    private Long partyBId;
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractInvoiceOutBoundVo.java
New file
@@ -0,0 +1,33 @@
package com.by4cloud.platformx.business.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ContractInvoiceOutBoundVo {
    private Long id;
    @Schema(description = "标的物名称")
    private String subjectMatterName;
    @Schema(description = "标的物编码")
    private String subjectMatterCode;
    @Schema(description = "标的物编码(内部唯一名称)")
    private String materialInternalName;
    @Schema(description = "出库数量")
    @Column(columnDefinition="decimal(10,0) comment '出库数量'")
    private BigDecimal outBoundNum;
    @Schema(description = "单价")
    private BigDecimal unitPrice;
    @Schema(description = "开票状态(0-未开票 1-开票中 2-已开票)")
    private String invoiceStatus;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundMergeVo.java
New file
@@ -0,0 +1,42 @@
package com.by4cloud.platformx.business.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ContractOutBoundMergeVo {
    @Schema(description = "税收分类")
    private String taxClass;
    @Schema(description = "税收分类拼接")
    private String itemName;
    private String materialName;
    @Schema(description = "标的物编码(内部唯一编码)")
    private String materialCode;
    @Schema(description = "标的物编码(内部唯一名称)")
    private String materialInternalName;
    private String specification;
    @Schema(description = "计量单位")
    private String unit;
    @Schema(description = "数量")
    private BigDecimal quantity;
    @Schema(description = "单价")
    private BigDecimal unitPrice;
    @Schema(description = "税率(百分比,如13表示13%)")
    private BigDecimal taxRate;
    @Schema(description = "税收分类编码")
    private String taxCode;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/ContractOutBoundVo.java
@@ -8,7 +8,7 @@
import java.math.BigDecimal;
@Data
public class ContractOutBoundVo extends ContractOutBound {
public class ContractOutBoundVo {
    //产品中信息
    @Schema(description = "产品id")
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/GenInvoiceInfoVo.java
New file
@@ -0,0 +1,43 @@
package com.by4cloud.platformx.business.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class GenInvoiceInfoVo {
    @Schema(description = "甲方名称")
    private String partyA;
    @Schema(description = "甲方税号")
    private String partyAOrgCode;
    @Schema(description = "乙方名称")
    private String partyB;
    @Schema(description = "乙方税号")
    private String partyBOrgCode;
    @Schema(description = "甲方开户行")
    private String partyAOpenBank;
    @Schema(description = "甲方银行账号")
    private String partyABankAccount;
    @Schema(description = "乙方开户行")
    private String partyBOpenBank;
    @Schema(description = "乙方银行账号")
    private String partyBBankAccount;
    @Schema(description = "开票金额(含税)")
    private BigDecimal totalPrice;
    @Schema(description = "大写开票金额")
    private String priceWords;
    private List<InvoiceItemVo> invoiceItemList;
}
platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/InvoiceItemVo.java
New file
@@ -0,0 +1,38 @@
package com.by4cloud.platformx.business.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.Column;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class InvoiceItemVo {
    private String erpCode;
    private String itemName;
    private String specification;
    @Schema(description = "计量单位")
    private String unit;
    @Schema(description = "数量")
    private BigDecimal quantity;
    @Schema(description = "单价")
    private BigDecimal unitPrice;
    @Schema(description = "金额(不含税)")
    private BigDecimal priceNoTax;
    @Schema(description = "税率(百分比,如13表示13%)")
    private BigDecimal taxRate;
    @Schema(description = "税额")
    private BigDecimal priceTax;
    @Schema(description = "税收分类编码")
    private String taxCode;
}
platformx-business-finance-biz/pom.xml
@@ -141,23 +141,6 @@
            <artifactId>poi-tl</artifactId>
            <version>1.12.2</version> <!-- 请使用最新稳定版 -->
        </dependency>
        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>2.0.24</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5.14</version>
        </dependency>
    </dependencies>
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/BillingInfoController.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/BillingItemController.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/BusinessCustomerController.java
@@ -52,7 +52,8 @@
        wrapper.eq(businessCustomer.getIndustryId()!=null,BusinessCustomer::getIndustryId,businessCustomer.getIndustryId());
        wrapper.eq(businessCustomer.getAreaId()!=null,BusinessCustomer::getAreaId,businessCustomer.getAreaId());
        wrapper.like(StrUtil.isNotEmpty(businessCustomer.getCompanyName()),BusinessCustomer::getCompanyName,businessCustomer.getCompanyName());
        return R.ok(businessCustomerService.page(page, wrapper));
        wrapper.orderByDesc(BusinessCustomer::getCreateTime);
        return R.ok(businessCustomerService.pageByScope(page, wrapper));
    }
    /**
@@ -66,7 +67,7 @@
    public R getBusinessCustomerList(@ParameterObject BusinessCustomer businessCustomer) {
        LambdaQueryWrapper<BusinessCustomer> wrapper = Wrappers.lambdaQuery();
        wrapper.like(StrUtil.isNotEmpty(businessCustomer.getCompanyName()),BusinessCustomer::getCompanyName,businessCustomer.getCompanyName());
        return R.ok(businessCustomerService.list(wrapper));
        return R.ok(businessCustomerService.listByScope(wrapper));
    }
    /**
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractBillingController.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractController.java
@@ -195,4 +195,37 @@
    public void exportContractYMJJGCLWord(@PathVariable("id" ) Long id, HttpServletResponse response) {
        contractService.exportContractYMJJGCLWord(id,response);
    }
    /**
     * 根据模版生成word一煤机工业品买卖合同
     * @param id id
     * @return R
     */
    @Operation(summary = "根据模版生成word合同" , description = "根据模版生成word合同" )
    @GetMapping("/exportContractYMJGYPMMWord/{id}" )
    public void exportContractYMJGYPMMWord(@PathVariable("id" ) Long id, HttpServletResponse response) {
        contractService.exportContractYMJGYPMMWord(id,response);
    }
    /**
     * 根据模版生成word一煤机工矿产品买卖合同
     * @param id id
     * @return R
     */
    @Operation(summary = "根据模版生成word合同" , description = "根据模版生成word合同" )
    @GetMapping("/exportContractYMJGKCPMMWord/{id}" )
    public void exportContractYMJGKCPMMWord(@PathVariable("id" ) Long id, HttpServletResponse response) {
        contractService.exportContractYMJGKCPMMWord(id,response);
    }
    /**
     * 根据模版生成word一煤机采购合同
     * @param id id
     * @return R
     */
    @Operation(summary = "根据模版生成word合同" , description = "根据模版生成word合同" )
    @GetMapping("/exportContractYMJCGWord/{id}" )
    public void exportContractYMJCGWord(@PathVariable("id" ) Long id, HttpServletResponse response) {
        contractService.exportContractYMJCGWord(id,response);
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ContractInvoiceController.java
New file
@@ -0,0 +1,126 @@
package com.by4cloud.platformx.business.controller;
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.business.dto.GenInvoiceInfoDTO;
import com.by4cloud.platformx.business.entity.Contract;
import com.by4cloud.platformx.business.service.ContractInvoiceService;
import com.by4cloud.platformx.business.service.ContractService;
import com.by4cloud.platformx.common.core.util.R;
import com.by4cloud.platformx.common.data.mybatis.BaseModel;
import com.by4cloud.platformx.common.security.annotation.Inner;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.http.HttpHeaders;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
/**
 * 合同开票
 *
 * @author syt
 * @date 2026年6月5日 08:13:55
 */
@RestController
@RequiredArgsConstructor
@RequestMapping("/contractInvoice" )
@Tag(description = "contract" , name = "合同开票" )
@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
public class ContractInvoiceController {
    private final ContractService contractService;
    private final ContractInvoiceService contractInvoiceService;
    /**
     * 分页查询
     * @param page 分页对象
     * @param contract 合同管理
     * @return
     */
    @Operation(summary = "分页查询" , description = "分页查询" )
    @GetMapping("/page" )
    public R getContractPage(@ParameterObject Page page, @ParameterObject Contract contract) {
        LambdaQueryWrapper<Contract> wrapper = Wrappers.lambdaQuery();
        wrapper.like(StringUtils.isNotBlank(contract.getContractName()),Contract::getContractName,contract.getContractName());
        wrapper.like(StringUtils.isNotBlank(contract.getPartyA()),Contract::getPartyA,contract.getPartyA());
        wrapper.eq(Contract::getBillingStatus,contract.getBillingStatus());
        if (StrUtil.equals(contract.getBillingStatus(),"1")){
            wrapper.orderByDesc(BaseModel::getCreateTime);
        }else {
            wrapper.orderByAsc(BaseModel::getCreateTime);
        }
        return R.ok(contractService.pageByScope(page, wrapper));
    }
    /**
     * 获取合同出库信息
     * @return
     */
    @GetMapping("/getContractOutBound/{contractId}" )
    public R getContractOutBound(@PathVariable("contractId")Long contractId) {
        return contractInvoiceService.getContractOutBound(contractId);
    }
    /**
     * 生成开票预览信息
     * @return
     */
    @PostMapping("/genInvoiceInfo" )
    public R genInvoiceInfo(@RequestBody GenInvoiceInfoDTO genInvoiceInfoDTO) {
        return contractInvoiceService.genInvoiceInfo(genInvoiceInfoDTO);
    }
    /**
     * 开蓝票
     * @return
     */
    @PostMapping("/toInvoice" )
    public R toInvoice(@RequestBody GenInvoiceInfoDTO genInvoiceInfoDTO) {
        return contractInvoiceService.toInvoice(genInvoiceInfoDTO);
    }
    /**
     * 获取已开发票
     * @return
     */
    @GetMapping("/getContractInvoiceList/{contractId}" )
    public R getContractInvoiceList(@PathVariable("contractId")Long contractId) {
        return contractInvoiceService.getContractInvoiceList(contractId);
    }
    /**
     * 蓝票查询
     * @return
     */
    @Inner(value = false)
    @GetMapping("/queryBlueInvoice")
    public R queryBlueInvoice() {
        return contractInvoiceService.queryBlueInvoice();
    }
    /**
     * 开红票
     * @return
     */
    @GetMapping("/toRedInvoice/{invoiceId}")
    public R toRedInvoice(@PathVariable("invoiceId")Long invoiceId) {
        return contractInvoiceService.toRedInvoice(invoiceId);
    }
    /**
     * 红票查询
     * @return
     */
    @Inner(value = false)
    @GetMapping("/queryRedInvoice")
    public R queryRedInvoice() {
        return contractInvoiceService.queryRedInvoice();
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/FlowCallBackController.java
@@ -1,6 +1,7 @@
package com.by4cloud.platformx.business.controller;
import com.by4cloud.platformx.business.constant.FlowNameEnum;
import com.by4cloud.platformx.business.service.ContractInvoiceService;
import com.by4cloud.platformx.business.service.ContractService;
import com.by4cloud.platformx.flow.task.constant.TaskStatusEnum;
import com.by4cloud.platformx.flow.task.dto.ProcessInstanceParamDto;
@@ -26,6 +27,7 @@
public class FlowCallBackController {
    private final ContractService contractService;
    private final ContractInvoiceService contractInvoiceService;
    /**
     * 开始节点事件
@@ -35,6 +37,9 @@
    @PostMapping("/startNodeEvent")
    public void startNodeEvent(@RequestBody ProcessNodeRecordParamDto recordParamDto){
        if (recordParamDto.getFlowName().equals(FlowNameEnum.合同审批.getName())) {
        }
        if (recordParamDto.getFlowName().equals(FlowNameEnum.销售挂账审批.getName())) {
        }
    }
@@ -55,6 +60,16 @@
                contractService.refuseApproval(Long.valueOf(processInstanceParamDto.getParamMap().get("id")+""));
            }
        }
        if (processInstanceParamDto.getFlowName().equals(FlowNameEnum.销售挂账审批.getName())) {
            //通过后更新主表状态
            if (processInstanceParamDto.getTaskStatus()== TaskStatusEnum.YJS.getCode()){
                contractInvoiceService.takeEffect(Long.valueOf(processInstanceParamDto.getParamMap().get("id")+""));
            }
            //拒绝后回退主表状态
            if (processInstanceParamDto.getTaskStatus()== TaskStatusEnum.JJ.getCode()){
                contractInvoiceService.refuseApproval(Long.valueOf(processInstanceParamDto.getParamMap().get("id")+""));
            }
        }
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/InvoiceResultController.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/ProductController.java
@@ -54,7 +54,8 @@
        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());
        Page<Product> page1 = productService.page(page, wrapper);
        wrapper.orderByDesc(Product::getCreateTime);
        Page<Product> page1 = productService.pageByScope(page, wrapper);
        List<Product> list = page1.getRecords();
        for(Product product1 : list){
            Product  parent = productService.getById(product1.getParentId());
@@ -81,7 +82,7 @@
        LambdaQueryWrapper<Product> wrapper = Wrappers.lambdaQuery();
        wrapper.like(StrUtil.isNotEmpty(product.getProductName()),Product::getProductName,product.getProductName());
        wrapper.last("limit 20");
        return R.ok(productService.list(wrapper));
        return R.ok(productService.listByScope(wrapper));
    }
    /**
@@ -98,7 +99,7 @@
        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));
        return R.ok(productService.listByScope(wrapper));
    }
    /**
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/SaleCreditController.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/controller/FpInvoiceResultController.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/BipInvoiceMapper.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FileBipMapper.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FpInvoiceResultItemMapper.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/mapper/FpInvoiceResultMapper.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/BIPYsService.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/BipInvoiceService.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FileBipService.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FileUploadService.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FpInvoiceResultItemService.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/FpInvoiceResultService.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/BIPYsServiceImpl.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/BipInvoiceServiceImpl.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FileBipServiceImpl.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FileUploadServiceImpl.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FpInvoiceResultItemServiceImpl.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/service/impl/FpInvoiceResultServiceImpl.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/BipApiEnum.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/BipHttpUtil.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/invoice/utils/NumUtils.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/BillingInfoMapper.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/BillingItemMapper.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/BwRequestRecordMapper.java
New file
@@ -0,0 +1,10 @@
package com.by4cloud.platformx.business.mapper;
import com.by4cloud.platformx.business.entity.BusinessCustomer;
import com.by4cloud.platformx.business.entity.BwRequestRecord;
import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface BwRequestRecordMapper extends PlatformxBaseMapper<BwRequestRecord> {
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractInvoiceMapper.java
New file
@@ -0,0 +1,9 @@
package com.by4cloud.platformx.business.mapper;
import com.by4cloud.platformx.business.entity.ContractInvoice;
import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ContractInvoiceMapper extends PlatformxBaseMapper<ContractInvoice> {
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/SaleCreditMapper.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/BillingInfoService.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/BillingItemService.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/BusinessCustomerService.java
@@ -2,7 +2,8 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.by4cloud.platformx.business.entity.BusinessCustomer;
import com.by4cloud.platformx.common.data.mybatis.IIService;
public interface BusinessCustomerService extends IService<BusinessCustomer> {
public interface BusinessCustomerService extends IIService<BusinessCustomer> {
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractInvoiceService.java
New file
@@ -0,0 +1,24 @@
package com.by4cloud.platformx.business.service;
import com.by4cloud.platformx.business.dto.GenInvoiceInfoDTO;
import com.by4cloud.platformx.common.core.util.R;
public interface ContractInvoiceService {
    R getContractOutBound(Long contractId);
    R genInvoiceInfo(GenInvoiceInfoDTO genInvoiceInfoDTO);
    R toInvoice(GenInvoiceInfoDTO genInvoiceInfoDTO);
    R getContractInvoiceList(Long contractId);
    R toRedInvoice(Long invoiceId);
    R queryBlueInvoice();
    R queryRedInvoice();
    void takeEffect(Long id);
    void refuseApproval(Long id);
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ContractService.java
@@ -38,4 +38,10 @@
    void exportContractYMJJGCLWord(Long id,HttpServletResponse response);
    R genCycleReceiced();
    void exportContractYMJGYPMMWord(Long id, HttpServletResponse response);
    void exportContractYMJGKCPMMWord(Long id, HttpServletResponse response);
    void exportContractYMJCGWord(Long id, HttpServletResponse response);
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/InvoiceService.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/PaymentConfirmService.java
@@ -1,5 +1,6 @@
package com.by4cloud.platformx.business.service;
import com.alibaba.fastjson.JSONObject;
import com.by4cloud.platformx.business.dto.PaymentConfirmAddDTO;
import com.by4cloud.platformx.business.entity.PaymentConfirm;
import com.by4cloud.platformx.common.core.util.R;
@@ -10,4 +11,8 @@
    R add(PaymentConfirmAddDTO addDTO);
    R syncPaymentRecepit();
    String getAccessToken(String accessToken);
    void saveBipRequestRecord(JSONObject params,String methodName, String result);
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/ProductService.java
@@ -3,10 +3,11 @@
import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.extension.service.IService;
import com.by4cloud.platformx.business.entity.Product;
import com.by4cloud.platformx.common.data.mybatis.IIService;
import java.util.List;
public interface ProductService extends IService<Product> {
public interface ProductService extends IIService<Product> {
    List<Tree<Long>> treeList(Long parentId, String productName);
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/SaleCreditService.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BillingInfoServiceImpl.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/BillingItemServiceImpl.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractInvoiceServiceImpl.java
New file
@@ -0,0 +1,649 @@
package com.by4cloud.platformx.business.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
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.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.api.feign.RemoteFlowProcessService;
import com.by4cloud.platformx.business.constant.FlowNameEnum;
import com.by4cloud.platformx.business.dto.GenInvoiceInfoDTO;
import com.by4cloud.platformx.business.entity.*;
import com.by4cloud.platformx.business.mapper.*;
import com.by4cloud.platformx.business.service.ContractInvoiceService;
import com.by4cloud.platformx.business.service.PaymentConfirmService;
import com.by4cloud.platformx.business.vo.ContractInvoiceOutBoundVo;
import com.by4cloud.platformx.business.vo.ContractOutBoundMergeVo;
import com.by4cloud.platformx.business.vo.GenInvoiceInfoVo;
import com.by4cloud.platformx.business.vo.InvoiceItemVo;
import com.by4cloud.platformx.common.core.util.R;
import com.by4cloud.platformx.common.data.mybatis.BaseModel;
import com.by4cloud.platformx.common.security.util.SecurityUtils;
import com.by4cloud.platformx.flow.task.dto.ProcessInstanceParamDto;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
@RequiredArgsConstructor
public class ContractInvoiceServiceImpl extends ServiceImpl<ContractInvoiceMapper, ContractInvoice> implements ContractInvoiceService {
    private final ContractMapper contractMapper;
    private final BusinessCustomerMapper businessCustomerMapper;
    private final ContractOutBoundMapper contractOutBoundMapper;
    private final ContractSubjectMatterMapper subjectMatterMapper;
    private final ProductMapper productMapper;
    private final BwRequestRecordMapper bwRequestRecordMapper;
    private final RemoteDeptService remoteDeptService;
    private final RemoteFlowProcessService remoteFlowProcessService;
    private final PaymentConfirmService paymentConfirmService;
    private final RedisTemplate redisTemplate;
    @Value("${BWInvoice.url}")
    private String bwUrl;
    @Value("${BWInvoice.flag}")
    private Boolean bwFlag;
    @Value("${bip.url}")
    private String url;
    @Value("${bip.appKey}")
    private String appKey;
    @Value("${bip.appSecret}")
    private String appSecret;
    @Override
    public R getContractOutBound(Long contractId) {
        MPJLambdaWrapper<ContractOutBound> wrapper = new MPJLambdaWrapper<ContractOutBound>()
                .selectAll(ContractOutBound.class)
                .eq(ContractOutBound::getContractId, contractId);
        List<ContractInvoiceOutBoundVo> invoiceOutBoundVoList = contractOutBoundMapper.selectJoinList(ContractInvoiceOutBoundVo.class, wrapper);
        return R.ok(invoiceOutBoundVoList);
    }
    @Override
    public R genInvoiceInfo(GenInvoiceInfoDTO genInvoiceInfoDTO) {
        if (ArrayUtil.isEmpty(genInvoiceInfoDTO.getContractOutBoundIds())) {
            return R.failed("请选择开票出库单后再操作");
        }
        ContractOutBound outBound = contractOutBoundMapper.selectById(genInvoiceInfoDTO.getContractOutBoundIds().get(0));
        Contract contract = contractMapper.selectById(outBound.getContractId());
        if (ObjUtil.isNull(contract)) {
            return R.failed("合同信息异常,请联系技术人员");
        }
        R<SysDept> r = remoteDeptService.getById(contract.getPartyBId());
        if (!r.isOk()) {
            return R.failed("获取开票单位异常");
        }
        SysDept b = r.getData();
        GenInvoiceInfoVo vo = genInvoiceInfoVo(genInvoiceInfoDTO, contract, b);
        return R.ok(vo);
    }
    private GenInvoiceInfoVo genInvoiceInfoVo(GenInvoiceInfoDTO genInvoiceInfoDTO, Contract contract, SysDept b) {
        GenInvoiceInfoVo vo = new GenInvoiceInfoVo();
        BusinessCustomer a = businessCustomerMapper.selectById(contract.getPartyAId());
        vo.setPartyA(a.getCompanyName());
        vo.setPartyAOrgCode(a.getCreditCode());
        vo.setPartyAOpenBank(a.getBankName());
        vo.setPartyABankAccount(a.getBankAccount());
        vo.setPartyB(b.getOrgName());
        vo.setPartyBOrgCode(b.getOrgCode());
        vo.setPartyBOpenBank(b.getOrgBank());
        vo.setPartyBBankAccount(b.getOrgBankAccount());
        List<InvoiceItemVo> invoiceItemVoList = new ArrayList<>();
        List<String> erpCode = new ArrayList<>();
        List<ContractOutBoundMergeVo> mergeOutBounds = new ArrayList<>();
        List<ContractOutBound> outBounds = contractOutBoundMapper.selectList(Wrappers.<ContractOutBound>lambdaQuery()
                .in(ContractOutBound::getId, genInvoiceInfoDTO.getContractOutBoundIds()));
        if (ArrayUtil.isNotEmpty(outBounds.toArray())) {
            outBounds.stream().forEach(contractOutBound -> {
                if (!ArrayUtil.contains(erpCode.toArray(), contractOutBound.getSubjectMatterCode())) {
                    erpCode.add(contractOutBound.getSubjectMatterCode());
                    ContractOutBoundMergeVo mergeVo = new ContractOutBoundMergeVo();
                    mergeVo.setMaterialCode(contractOutBound.getSubjectMatterCode());
                    mergeVo.setMaterialInternalName(contractOutBound.getSubjectMatterName());
                    mergeVo.setQuantity(contractOutBound.getOutBoundNum());
                    Product product = productMapper.selectOne(Wrappers.<Product>lambdaQuery().eq(Product::getErpCode, contractOutBound.getSubjectMatterCode())
                            .eq(Product::getCompId, SecurityUtils.getUser().getCompId()).last("limit 1"));
                    if (ObjUtil.isNotNull(product)) {
                        mergeVo.setTaxClass(product.getTaxClass());
                        mergeVo.setSpecification(product.getProductType());
                        mergeVo.setTaxRate(new BigDecimal(product.getTaxRate()));
                        mergeVo.setTaxCode(product.getTaxCode());
                        Product productClass = productMapper.selectById(product.getParentId());
                        if (ObjUtil.isNotNull(product)) {
                            mergeVo.setItemName("*" + product.getTaxClass() + "*" + productClass.getProductName());
                        }
                    }
                    ContractSubjectMatter subjectMatter = subjectMatterMapper.selectOne(Wrappers.<ContractSubjectMatter>lambdaQuery()
                            .eq(ContractSubjectMatter::getMaterialCode, contractOutBound.getSubjectMatterCode())
                            .eq(ContractSubjectMatter::getContractId, contract.getId()).last("limit 1"));
                    if (ObjUtil.isNotNull(subjectMatter)) {
                        mergeVo.setUnitPrice(subjectMatter.getUnitPrice());
                        mergeVo.setUnit(subjectMatter.getUnit());
                    }
                    mergeOutBounds.add(mergeVo);
                } else {
                    List<ContractOutBoundMergeVo> filteredList = mergeOutBounds.stream()
                            .filter(item -> contractOutBound.getSubjectMatterCode().equals(item.getMaterialCode())) // 防止空指针,建议常量在前
                            .collect(Collectors.toList());
                    if (ArrayUtil.isNotEmpty(filteredList.toArray())) {
                        filteredList.get(0).setQuantity(filteredList.get(0).getQuantity().add(contractOutBound.getOutBoundNum()));
                    }
                }
            });
            if (ArrayUtil.isNotEmpty(mergeOutBounds.toArray())) {
                invoiceItemVoList = BeanUtil.copyToList(mergeOutBounds, InvoiceItemVo.class);
                invoiceItemVoList.stream().forEach(invoiceItemVo -> {
//                for (InvoiceItemVo invoiceItemVo:invoiceItemVoList) {
                    BigDecimal itemPrice = invoiceItemVo.getUnitPrice().multiply(invoiceItemVo.getQuantity());
                    BigDecimal itemPriceTax = itemPrice.divide(new BigDecimal("100").add(invoiceItemVo.getTaxRate()), 2, RoundingMode.HALF_UP).multiply(invoiceItemVo.getTaxRate());
                    invoiceItemVo.setPriceTax(itemPriceTax);
                    invoiceItemVo.setPriceNoTax(itemPrice.subtract(itemPriceTax));
                });
                vo.setTotalPrice(invoiceItemVoList.stream().map(item -> item.getPriceTax().add(item.getPriceNoTax())).reduce(BigDecimal.ZERO, BigDecimal::add));
                vo.setInvoiceItemList(invoiceItemVoList);
                vo.setPriceWords(Convert.digitToChinese(vo.getTotalPrice()));
            }
        }
        return vo;
    }
    @Override
    public R toInvoice(GenInvoiceInfoDTO genInvoiceInfoDTO) {
        if (ArrayUtil.isEmpty(genInvoiceInfoDTO.getContractOutBoundIds().toArray())) {
            return R.failed("请选择开票出库单后再操作");
        }
        ContractOutBound outBound = contractOutBoundMapper.selectById(genInvoiceInfoDTO.getContractOutBoundIds().get(0));
        Contract contract = contractMapper.selectById(outBound.getContractId());
        if (ObjUtil.isNull(contract)) {
            return R.failed("合同信息异常,请联系技术人员");
        }
        R<SysDept> r = remoteDeptService.getById(contract.getPartyBId());
        if (!r.isOk()) {
            return R.failed("获取开票单位异常");
        }
        SysDept b = r.getData();
        GenInvoiceInfoVo vo = genInvoiceInfoVo(genInvoiceInfoDTO, contract, b);
        //发票保存
        ContractInvoice invoice = saveContractInvoice(vo, contract, genInvoiceInfoDTO.getContractOutBoundIds(), DateUtil.current() + "");
        //启动流程
        ProcessInstanceParamDto dto = new ProcessInstanceParamDto();
        Map<String, Object> map = BeanUtil.beanToMap(invoice);
        dto.setParamMap(map);
        dto.setFlowName(FlowNameEnum.销售挂账审批.name());
        R r1 = remoteFlowProcessService.startProcessInstance(dto);
        if (r1.getCode() == 1) {
            return R.failed("流程启动失败");
        }
        //更新合同出库单状态
        genInvoiceInfoDTO.getContractOutBoundIds().stream().forEach(outBoundId -> {
            ContractOutBound bound = contractOutBoundMapper.selectById(outBoundId);
            bound.setInvoiceStatus("1");
            contractOutBoundMapper.updateById(bound);
        });
        return R.ok();
    }
    private void saveBwRequestRecord(String method, String requestId, String toJSONString, String result) {
        BwRequestRecord bwRequestRecord = new BwRequestRecord();
        bwRequestRecord.setRequestId(requestId);
        bwRequestRecord.setRequestParams(toJSONString);
        bwRequestRecord.setResponseParams(result);
        bwRequestRecord.setResponseCode(JSONObject.parseObject(result).getString("success"));
        bwRequestRecord.setInterfaceName(method);
        bwRequestRecordMapper.insert(bwRequestRecord);
    }
    private JSONObject genBlueInvoice(GenInvoiceInfoVo vo, String serialNo) {
        JSONObject jsonObject = new JSONObject();
        //销方
        jsonObject.put("taxNo", vo.getPartyBOrgCode());//税号
        jsonObject.put("isSplit", false);//超过发票单张限额是否需要拆分开具,默认不拆分(拆分只支持发票类型代码为 专票 004 普票 007 电子票 026的
        jsonObject.put("taxUserName", "");//登录名为税局页面登        录名
        jsonObject.put("formatGenerate", false);//是否需要生成版式返回版式链接(true / false)
        jsonObject.put("formatPushType", false);//版式生成是否推送(true / false)
        //data
        JSONObject data = new JSONObject();
        data.put("invoiceTypeCode", "01");
        data.put("serialNo", serialNo);
        //data.invoiceDetailsList
        JSONArray invoiceDetailsList = new JSONArray();
        Integer lineNo = 1;
        for (InvoiceItemVo invoiceItemVo : vo.getInvoiceItemList()) {
            JSONObject invoiceDetail = new JSONObject();
            invoiceDetail.put("goodsLineNo", lineNo);
            invoiceDetail.put("goodsCode", invoiceItemVo.getTaxCode());
            invoiceDetail.put("goodsTaxRate", invoiceItemVo.getTaxRate().divide(new BigDecimal("100")));
            invoiceDetail.put("goodsUnit", invoiceItemVo.getUnit());
            invoiceDetail.put("goodsQuantity", invoiceItemVo.getQuantity());
            invoiceDetail.put("goodsPrice", invoiceItemVo.getUnitPrice());
            invoiceDetail.put("goodsTotalPrice", invoiceItemVo.getUnitPrice().multiply(invoiceItemVo.getQuantity()));
            invoiceDetail.put("goodsTotalTax", invoiceItemVo.getPriceTax());
            invoiceDetailsList.add(invoiceDetail);
            lineNo++;
        }
        jsonObject.put("invoiceDetailsList", invoiceDetailsList);
        //购方
        data.put("buyerTaxNo", vo.getPartyAOrgCode());
        data.put("buyerName", vo.getPartyA());
        data.put("invoiceTotalPrice", vo.getTotalPrice().subtract(vo.getInvoiceItemList().stream().map(item -> item.getPriceTax()).reduce(BigDecimal.ZERO, BigDecimal::add)));
        data.put("invoiceTotalTax", vo.getInvoiceItemList().stream().map(item -> item.getPriceTax()).reduce(BigDecimal.ZERO, BigDecimal::add));
        data.put("invoiceTotalPriceTax", vo.getTotalPrice());
        data.put("buyerBankName", vo.getPartyAOpenBank());
        data.put("buyerBankNumber", vo.getPartyABankAccount());
        jsonObject.put("data", data);
        return jsonObject;
    }
    private ContractInvoice saveContractInvoice(GenInvoiceInfoVo genInvoiceInfoVo, Contract contract, List<Long> outBoundIds, String serialNo) {
        ContractInvoice invoice = new ContractInvoice();
        invoice.setContractId(contract.getId());
        invoice.setInvoiceCategory("1");
        invoice.setRedReversal("0");
        invoice.setSerialNo(serialNo);
        invoice.setTexNo(genInvoiceInfoVo.getPartyBOrgCode());
        invoice.setSellerTaxName(genInvoiceInfoVo.getPartyB());
        invoice.setBuyerTaxName(genInvoiceInfoVo.getPartyA());
        invoice.setInvoiceTotalTax(genInvoiceInfoVo.getInvoiceItemList().stream().map(item -> item.getPriceTax()).reduce(BigDecimal.ZERO, BigDecimal::add));
        invoice.setInvoiceTotalPrice(genInvoiceInfoVo.getTotalPrice().subtract(invoice.getInvoiceTotalTax()));
        invoice.setInvoiceTotalPriceTax(genInvoiceInfoVo.getTotalPrice());
        invoice.setInvoicePreview(JSONObject.toJSONString(genInvoiceInfoVo));
        invoice.setInvoiceStatus("1");
        invoice.setApprovalStatus("0");
        invoice.setOutBoundId(outBoundIds.stream()
                .map(String::valueOf) // 或者 .map(Object::toString)
                .collect(Collectors.joining(",")));
        baseMapper.insert(invoice);
        return invoice;
    }
    @Override
    public R getContractInvoiceList(Long contractId) {
        List<ContractInvoice> invoiceList = baseMapper.selectList(Wrappers.<ContractInvoice>lambdaQuery()
                .eq(ContractInvoice::getContractId, contractId)
                .orderByDesc(ContractInvoice::getCreateTime));
        return R.ok(invoiceList);
    }
    @Override
    public R toRedInvoice(Long invoiceId) {
        ContractInvoice blueInvoice = baseMapper.selectById(invoiceId);
        blueInvoice.setRedReversal("2");
        baseMapper.updateById(blueInvoice);
        ContractInvoice invoice = new ContractInvoice();
        invoice.setContractId(blueInvoice.getContractId());
        invoice.setTexNo(blueInvoice.getTexNo());
        invoice.setSellerTaxName(blueInvoice.getSellerTaxName());
        invoice.setBuyerTaxName(blueInvoice.getBuyerTaxName());
        invoice.setInvoiceTotalTax(blueInvoice.getInvoiceTotalTax());
        invoice.setInvoiceTotalPrice(blueInvoice.getInvoiceTotalPrice());
        invoice.setInvoiceTotalPriceTax(blueInvoice.getInvoiceTotalPriceTax());
        invoice.setInvoicePreview(blueInvoice.getInvoicePreview());
        invoice.setInvoiceTotalTax(blueInvoice.getInvoiceTotalTax());
        invoice.setInvoiceTotalPrice(blueInvoice.getInvoiceTotalPrice());
        invoice.setInvoiceTotalPriceTax(blueInvoice.getInvoiceTotalPriceTax());
        invoice.setOutBoundId(blueInvoice.getOutBoundId());
        invoice.setInvoiceTime(new Date());
        invoice.setInvoiceCategory("2");
        invoice.setRedReversal("0");
        invoice.setInvoiceStatus("0");
        invoice.setSerialNo(DateUtil.current() + "");
        invoice.setBlueInvoiceId(invoiceId);
        invoice.setApprovalStatus("0");
        baseMapper.insert(invoice);
        //启动流程
        ProcessInstanceParamDto dto = new ProcessInstanceParamDto();
        Map<String, Object> map = BeanUtil.beanToMap(invoice);
        dto.setParamMap(map);
        dto.setFlowName(FlowNameEnum.销售挂账审批.name());
        R r1 = remoteFlowProcessService.startProcessInstance(dto);
        if (r1.getCode() == 1) {
            return R.failed("流程启动失败");
        }
        return R.ok();
    }
    private JSONObject genRedInvoice(ContractInvoice blueInvoice, String redConfirmSerialNo) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("taxNo", blueInvoice.getTexNo());
        jsonObject.put("redConfirmSerialNo", redConfirmSerialNo);
        jsonObject.put("entryIdentity", "01");
        jsonObject.put("sellerTaxNo", blueInvoice.getTexNo());
        jsonObject.put("sellerTaxName", blueInvoice.getSellerTaxName());
        jsonObject.put("buyerTaxName", blueInvoice.getBuyerTaxName());
        jsonObject.put("originalInvoiceNo", blueInvoice.getInvoiceNo());
        jsonObject.put("originInvoiceIsPaper", "N");
        jsonObject.put("originInvoiceDate", blueInvoice.getInvoiceTime());
        jsonObject.put("originInvoiceTotalPrice", blueInvoice.getInvoiceTotalPrice());
        jsonObject.put("originInvoiceTotalTax", blueInvoice.getInvoiceTotalPrice());
        jsonObject.put("originInvoiceType", "01");
        jsonObject.put("invoiceTotalPrice", blueInvoice.getInvoiceTotalPrice());
        jsonObject.put("invoiceTotalTax", blueInvoice.getInvoiceTotalPrice());
        jsonObject.put("redInvoiceLabel", "2");
        GenInvoiceInfoVo vo = BeanUtil.copyProperties(JSONObject.parseObject(blueInvoice.getInvoicePreview()), GenInvoiceInfoVo.class);
        JSONArray invoiceDetailsList = new JSONArray();
        Integer lineNo = 1;
        for (InvoiceItemVo invoiceItemVo : vo.getInvoiceItemList()) {
            JSONObject invoiceDetail = new JSONObject();
            invoiceDetail.put("originalInvoiceDetailNo", lineNo);
            invoiceDetail.put("goodsLineNo", lineNo);
            invoiceDetail.put("goodsCode", invoiceItemVo.getTaxCode());
            invoiceDetail.put("goodsTaxRate", invoiceItemVo.getTaxRate().divide(new BigDecimal("100")));
            invoiceDetail.put("goodsUnit", invoiceItemVo.getUnit());
            invoiceDetail.put("goodsQuantity", invoiceItemVo.getQuantity());
            invoiceDetail.put("goodsPrice", invoiceItemVo.getUnitPrice());
            invoiceDetail.put("goodsTotalPrice", invoiceItemVo.getUnitPrice().multiply(invoiceItemVo.getQuantity()));
            invoiceDetail.put("goodsTotalTax", invoiceItemVo.getPriceTax());
            invoiceDetailsList.add(invoiceDetail);
            lineNo++;
        }
        jsonObject.put("redConfirmDetailReqEntityList", invoiceDetailsList);
        return jsonObject;
    }
    @Override
    public R queryBlueInvoice() {
        if (bwFlag) {
            List<ContractInvoice> contractInvoices = baseMapper.selectList(Wrappers.<ContractInvoice>lambdaQuery()
                    .eq(ContractInvoice::getInvoiceCategory, "1").eq(ContractInvoice::getInvoiceStatus, "1"));
            if (ArrayUtil.isNotEmpty(contractInvoices.toArray())) {
                contractInvoices.stream().forEach(contractInvoice -> {
                    JSONObject request = new JSONObject();
                    request.put("tax_no", contractInvoice.getTexNo());
                    JSONObject data = new JSONObject();
                    data.put("serial_no", contractInvoice.getSerialNo());
                    data.put("return_type", "1");
                    String requestId = IdUtil.fastUUID();
                    log.info("serial_no:{},发票查询入参:{},", contractInvoice.getSerialNo(), request.toJSONString());
                    String result = HttpUtil.post("method=baiwang.output.format.query&version=1.0&request_id=" + requestId, request.toJSONString());
                    log.info("serial_no:{},发票查询回参:{},", contractInvoice.getSerialNo(), result);
                    saveBwRequestRecord("baiwang.output.format.query", requestId, request.toJSONString(), result);
                    JSONObject resultObj = JSONObject.parseObject(result);
                    if (resultObj.containsKey("requestId") && StrUtil.equals(resultObj.getString("requestId"), requestId) && resultObj.getBoolean("success")) {
                        JSONObject model = resultObj.getJSONObject("model");
                        contractInvoice.setInvoicePath(model.getString("query_data"));
                        contractInvoice.setInvoiceStatus("2");
                        baseMapper.updateById(contractInvoice);
                    }
                    //推送BIP
                    pushBipInvoice(contractInvoice);
                });
            }
        }
        return R.ok();
    }
    private void pushBipInvoice(ContractInvoice contractInvoice) {
        String accessToken = "";
        if (redisTemplate.hasKey("BIP_TOKEN")) {
            accessToken = (String) redisTemplate.opsForValue().get("BIP_TOKEN");
        } else {
            paymentConfirmService.getAccessToken(accessToken);
        }
        if (StrUtil.isEmpty(accessToken)) {
            log.error("bip accessToken 获取异常");
            return;
        }
        //蓝票
        if (StrUtil.equals(contractInvoice.getInvoiceCategory(),"1")) {
            JSONObject params = genBlueReceiveParams(contractInvoice);
            String finalAccessToken = accessToken;
            log.info("XSJZ_YS_DJ_INSERT Request:", params.toJSONString());
            String result = HttpUtil.post(url + "/yonbip/EFI/receivable/save?access_token=" + finalAccessToken, params.toJSONString());
            log.info("XSJZ_YS_DJ_INSERT Response:{}", result);
            //保存请求记录
            paymentConfirmService.saveBipRequestRecord(params, "< XSJZ_YS_DJ_001>-应收发票保存接口", result);
            JSONObject resultJson = JSONObject.parseObject(result);
            if (resultJson.containsKey("code") && resultJson.getString("code").equals("200")) {
                JSONObject data = resultJson.getJSONObject("data");
                contractInvoice.setBipPush("1");
                contractInvoice.setBipId(data.getLong("id"));
                contractInvoice.setBipBody(resultJson.getString("data"));
                baseMapper.updateById(contractInvoice);
            }
        }
        //红票
        if (StrUtil.equals(contractInvoice.getInvoiceCategory(),"2")) {
            JSONObject params = genRedReceiveParams(contractInvoice);
            String finalAccessToken = accessToken;
            log.info("XSJZ_YS_DJ_DELETE Request:", params.toJSONString());
            String result = HttpUtil.post(url + "/yonbip/EFI/receivable/delete?access_token=" + finalAccessToken, params.toJSONString());
            log.info("XSJZ_YS_DJ_DELETE Response:{}", result);
            //保存请求记录
            paymentConfirmService.saveBipRequestRecord(params, "< XSJZ_YS_DJ_002>-应收发票删除接口", result);
            JSONObject resultJson = JSONObject.parseObject(result);
            if (resultJson.containsKey("code") && resultJson.getString("code").equals("200")) {
                contractInvoice.setBipPush("1");
                baseMapper.updateById(contractInvoice);
            }
        }
    }
    private JSONObject genRedReceiveParams(ContractInvoice contractInvoice) {
        JSONObject jsonObject = new JSONObject();
        JSONObject data = new JSONObject();
        data.put("id",contractInvoice.getBipId());
        jsonObject.put("data",data);
        return  jsonObject;
    }
    private JSONObject genBlueReceiveParams(ContractInvoice contractInvoice) {
        JSONObject jsonObject = new JSONObject();
        JSONObject data = new JSONObject();
        if (contractInvoice.getInvoiceCategory().equals("1")){
            data.put("direction","1");
        }else {
            data.put("direction","-1");
        }
        data.put("billDate",DateUtil.format(contractInvoice.getInvoiceTime(),DatePattern.NORM_DATETIME_FORMAT));
        data.put("objectType","1");
        data.put("exchangeRate","1");
        data.put("exchangeRate",DateUtil.now());
        data.put("_status","Insert");
        GenInvoiceInfoVo vo = BeanUtil.copyProperties(JSONObject.parseObject(contractInvoice.getInvoicePreview()), GenInvoiceInfoVo.class);
        JSONArray bodyItem = new JSONArray();
        for (InvoiceItemVo invoiceItemVo : vo.getInvoiceItemList()) {
            JSONObject item = new JSONObject();
            item.put("invoiceNo",contractInvoice.getInvoiceNo());
            item.put("materialCode",invoiceItemVo.getErpCode());
            item.put("taxRate", invoiceItemVo.getTaxRate());
            item.put("oriTaxAmount", invoiceItemVo.getPriceTax());
            item.put("oriTaxIncludedAmount", invoiceItemVo.getUnitPrice().multiply(invoiceItemVo.getQuantity()));
            item.put("_status","Insert");
            bodyItem.add(item);
        }
        data.put("bodyItem",bodyItem);
        jsonObject.put("data",data);
        return  jsonObject;
    }
    @Override
    public R queryRedInvoice() {
        if (bwFlag) {
            List<ContractInvoice> contractInvoices = baseMapper.selectList(Wrappers.<ContractInvoice>lambdaQuery()
                    .eq(ContractInvoice::getInvoiceCategory, "2").eq(ContractInvoice::getInvoiceStatus, "3"));
            if (ArrayUtil.isNotEmpty(contractInvoices.toArray())) {
                contractInvoices.stream().forEach(contractInvoice -> {
                    JSONObject request = new JSONObject();
                    request.put("taxNo", contractInvoice.getTexNo());
                    JSONObject data = new JSONObject();
                    data.put("redConfirmSerialNo", contractInvoice.getSerialNo());
                    data.put("buySelSelector", "1");
                    String requestId = IdUtil.fastUUID();
                    log.info("serial_no:{},红字确认单查询入参:{},", contractInvoice.getSerialNo(), request.toJSONString());
                    String result = HttpUtil.post("method=baiwang.output.redinvoice.formlist&&version=1.0&request_id=" + requestId, request.toJSONString());
                    log.info("serial_no:{},红字确认单查询回参:{},", contractInvoice.getSerialNo(), result);
                    JSONObject resultObj = JSONObject.parseObject(result);
                    saveBwRequestRecord("baiwang.output.redinvoice.formlist", requestId, request.toJSONString(), result);
                    if (resultObj.containsKey("requestId") && StrUtil.equals(resultObj.getString("requestId"), requestId) && resultObj.getBoolean("success")) {
                        JSONArray models = JSONArray.parseArray(resultObj.getString("model"));
                        if (ArrayUtil.isNotEmpty(models.toArray())) {
                            contractInvoice.setInvoiceStatus("2");
                            contractInvoice.setRedReversal("1");
                            baseMapper.updateById(contractInvoice);
                        }
                    }
                });
            }
        }
        return R.ok();
    }
    @Override
    public void takeEffect(Long id) {
        ContractInvoice invoice = baseMapper.selectById(id);
        Contract contract = contractMapper.selectById(invoice.getContractId());
        GenInvoiceInfoVo vo = BeanUtil.copyProperties(JSONObject.parseObject(invoice.getInvoicePreview()), GenInvoiceInfoVo.class);
        //蓝票
        if (invoice.getInvoiceCategory().equals("1")) {
            // TODO 开蓝票接口
            JSONObject request = genBlueInvoice(vo, invoice.getSerialNo());
            if (bwFlag) {
                String requestId = IdUtil.fastUUID();
                log.info("蓝票请求接口入参", request.toJSONString());
                String result = HttpUtil.post(bwUrl + "method=baiwang.output.invoice.issue&version=1.0&requestId=" + requestId, request.toJSONString());
                log.info("蓝票请求接口回参", result);
                saveBwRequestRecord("baiwang.output.invoice.issue", requestId, request.toJSONString(), result);
                JSONObject resultObj = JSONObject.parseObject(result);
                if (resultObj.containsKey("requestId") && StrUtil.equals(resultObj.getString("requestId"), requestId) &&
                        !resultObj.getBoolean("success")) {
                }
                JSONArray models = JSONArray.parseArray(resultObj.getString("success"));
                if (ArrayUtil.isNotEmpty(models.toArray())) {
                    JSONObject model = (JSONObject) models.get(0);
                    Date invoiceDate = DateUtil.parse(model.getString("invoiceDate"), DatePattern.PURE_DATETIME_PATTERN);
                    invoice.setInvoiceTime(invoiceDate);
                    invoice.setInvoiceNo(model.getString("invoiceNo"));
                }
            }
            //合同状态
            if (StrUtil.equals(contract.getBillingStatus(), "2")) {
                if (ObjUtil.isNull(contract.getBillingAmout())) {
                    contract.setBillingAmout(vo.getTotalPrice());
                    if (contract.getBillingAmout().compareTo(contract.getAmount()) == 0) {
                        contract.setBillingStatus("3");
                    }
                    contractMapper.updateById(contract);
                } else {
                    contract.setBillingAmout(vo.getTotalPrice().add(contract.getBillingAmout()));
                    if (contract.getBillingAmout().compareTo(contract.getAmount()) == 0) {
                        contract.setBillingStatus("3");
                    }
                    contractMapper.updateById(contract);
                }
            } else {
                if (ObjUtil.isNull(contract.getBillingAmout())) {
                    contract.setBillingAmout(vo.getTotalPrice());
                    contractMapper.updateById(contract);
                } else {
                    contract.setBillingAmout(vo.getTotalPrice().add(contract.getBillingAmout()));
                    contractMapper.updateById(contract);
                }
            }
        }
        //红票
        if (invoice.getInvoiceCategory().equals("2")) {
            // TODO 开红票接口
            ContractInvoice blueInvoice = baseMapper.selectById(invoice.getBlueInvoiceId());
            JSONObject request = genRedInvoice(blueInvoice, invoice.getSerialNo());
            String requestId = IdUtil.fastUUID();
            if (bwFlag) {
                log.info("红字确认单请求接口入参", request.toJSONString());
                String result = HttpUtil.post(bwUrl + "method=baiwang.output.redinvoice.add&version=1.0&requestId=" + requestId, request.toJSONString());
                log.info("红字确认单请求接口回参", result);
                saveBwRequestRecord("baiwang.output.redinvoice.add", requestId, request.toJSONString(), result);
                JSONObject resultObj = JSONObject.parseObject(result);
                if (resultObj.containsKey("requestId") && StrUtil.equals(resultObj.getString("requestId"), requestId) &&
                        !resultObj.getBoolean("success")) {
                    JSONArray models = JSONArray.parseArray(resultObj.getString("success"));
                    if (ArrayUtil.isNotEmpty(models.toArray())) {
                        JSONObject model = (JSONObject) models.get(0);
                        if (StrUtil.isEmpty(model.getString("confirmBillingMark"))||StrUtil.equals(model.getString("confirmBillingMark"),"N")) {
                            //等待确认
                            invoice.setRedReversal("3");
                        }else if (StrUtil.equals(model.getString("confirmBillingMark"),"Y")) {
                            //确认即开
                            invoice.setInvoiceNo(model.getString("redInvoiceNo"));
                            invoice.setRedReversal("1");
                            pushBipInvoice(invoice);
                        }
                    }
                }
            }
            //更新合同开票状态
            contract.setBillingStatus("2");
            contract.setBillingAmout(contract.getAmount().subtract(invoice.getInvoiceTotalPriceTax()));
            contractMapper.updateById(contract);
            //更新合同出库单状态
            String[] outBoundIds = blueInvoice.getOutBoundId().split(",");
            Arrays.stream(outBoundIds).forEach(outBoundId -> {
                ContractOutBound bound = contractOutBoundMapper.selectById(outBoundId);
                bound.setInvoiceStatus("0");
                contractOutBoundMapper.updateById(bound);
            });
        }
        invoice.setApprovalStatus("1");
        baseMapper.updateById(invoice);
    }
    @Override
    public void refuseApproval(Long id) {
        ContractInvoice invoice = baseMapper.selectById(id);
        //更新合同出库单状态
        String[] outBoundIds = invoice.getOutBoundId().split(",");
        Arrays.stream(outBoundIds).forEach(outBoundId -> {
            ContractOutBound bound = contractOutBoundMapper.selectById(outBoundId);
            bound.setInvoiceStatus("0");
            contractOutBoundMapper.updateById(bound);
        });
        invoice.setApprovalStatus("2");
        baseMapper.updateById(invoice);
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ContractServiceImpl.java
@@ -36,6 +36,7 @@
import java.io.IOException;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
@@ -58,7 +59,7 @@
    private final MeterReadRecordMapper meterReadRecordMapper;
    private final ContractExecDateMapper contractExecDateMapper;
    private final RemoteFlowProcessService remoteFlowProcessService;
    private final ContractTemplateMapper contractTemplateMapper;
    private final ProductMapper productMapper;
    private final RemoteDeptService remoteDeptService;
    @Value("${file.local.base-path}")
@@ -235,6 +236,10 @@
        detailVo.setContractSubjectMatter(subjectMatterList);
        List<ContractPaymentSchedule> paymentScheduleList = contractPaymentScheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery().eq(ContractPaymentSchedule::getContractId, contract.getId()));
        detailVo.setContractPaymentSchedule(paymentScheduleList);
        BusinessCustomer a = businessCustomerMapper.selectById(contract.getPartyAId());
        if (ObjUtil.isNotNull(a)){
            detailVo.setPartyAOrgCode(a.getCreditCode());
        }
        return detailVo;
    }
@@ -657,7 +662,7 @@
        try {
            // 1. 加载模版
            // 假设模版在 resources/templates/template.docx
            ClassPathResource resource = new ClassPathResource("template/ymjjgclht.docx");
            ClassPathResource resource = new ClassPathResource("template/ymj/ymjjgclht.docx");
            // 配置列表策略
            Configure config = Configure.builder()
                    .bind("items", new LoopRowTableRenderPolicy()) // 将 items 绑定到行循环策略
@@ -760,4 +765,312 @@
        }
        return R.ok();
    }
    @Override
    public void exportContractYMJGYPMMWord(Long id, HttpServletResponse response) {
        Contract contract = baseMapper.selectById(id);
        List<ContractSubjectMatter> subjectMatterList = contractSubjectMatterMapper.selectList(Wrappers.<ContractSubjectMatter>lambdaQuery()
                .eq(ContractSubjectMatter::getContractId, id).orderByAsc(ContractSubjectMatter::getCreateTime));
        Map<String, Object> map = new HashMap<>();
        //合同基本信息
        map.put("partyA", contract.getPartyA());
        map.put("partyB", contract.getPartyB());
        map.put("contractNo", contract.getContractNo());
        map.put("signPlace", contract.getSignPlace());
        map.put("signDate", DateUtil.formatDate(contract.getSignDate()));
        map.put("signDateYMD", DateUtil.format(contract.getSignDate(), DatePattern.CHINESE_DATE_PATTERN));
        map.put("total", contract.getAmount());
        map.put("amountWords", Convert.digitToChinese(contract.getAmount()));
        //标的物
        List<Map<String, Object>> items = new ArrayList<>();
        List<RowRenderData> dataList = new ArrayList<>();
        AtomicReference<Integer> no = new AtomicReference<>(0);
        subjectMatterList.stream().forEach(contractSubjectMatter -> {
            Map<String, Object> item = new HashMap<>();
            item.put("no", no);
            item.put("materialName", contractSubjectMatter.getMaterialName());
            item.put("guige", contractSubjectMatter.getSpecification());
            item.put("unit", contractSubjectMatter.getUnit());
            item.put("quantity", contractSubjectMatter.getQuantity());
            item.put("danzhong", contractSubjectMatter.getSingleWight());
            item.put("zongzhong", contractSubjectMatter.getTotalWight());
            item.put("unitPrice", contractSubjectMatter.getUnitPrice());
            item.put("price", contractSubjectMatter.getTotalAmount());
            if (no.get().equals(Integer.valueOf(0))){
                item.put("deliveryCycle",contract.getDeliveryCycle());
            }
            items.add(item);
            no.updateAndGet(v -> v + 1);
        });
        map.put("items", items);
        //定制方
        BusinessCustomer customer = businessCustomerMapper.selectById(contract.getPartyAId());
        map.put("companyName", customer.getCompanyName());
        map.put("legalPerson", customer.getLegalPerson());
        map.put("contactPhone", customer.getContactPhone());
        map.put("bankName", customer.getBankName());
        map.put("bankAccount", customer.getBankAccount());
        //承揽方
        R<SysDept> r = remoteDeptService.getById(contract.getPartyBId());
        SysDept dept = r.getData();
        map.put("orgName", dept.getOrgName());
        map.put("legalPerson1", StrUtil.isNotEmpty(dept.getLegalPerson()) ? dept.getLegalPerson() : "");
        map.put("entrustedAgent", StrUtil.isNotEmpty(dept.getLegalPerson()) ? "" : dept.getEntrustedAgent());
        map.put("orgContact", dept.getOrgContact());
        map.put("orgBank", dept.getOrgBank());
        map.put("orgBankAccount", dept.getOrgBankAccount());
        //生成文件名
        Long time = new Date().getTime();
        // 生成的word格式
        String formatSuffix = ".docx";
        // 拼接后的文件名
        String fileName = time + formatSuffix;//文件名  带后缀
        //导出word
        try {
            // 1. 加载模版
            // 假设模版在 resources/templates/template.docx
            ClassPathResource resource = new ClassPathResource("template/ymj/ymjgypmmht.docx");
            // 配置列表策略
            Configure config = Configure.builder()
                    .bind("items", new LoopRowTableRenderPolicy()) // 将 items 绑定到行循环策略
                    .build();
            // 2. 编译并渲染数据
            XWPFTemplate xwpfTemplate = XWPFTemplate.compile(resource.getInputStream(), config).render(map);
            // 3. 设置响应头
            response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".docx");
            // 4. 写入输出流
            OutputStream out = response.getOutputStream();
            xwpfTemplate.write(out);
            out.flush();
            out.close();
            xwpfTemplate.close(); // 重要:关闭模版释放资源
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void exportContractYMJGKCPMMWord(Long id, HttpServletResponse response) {
        Contract contract = baseMapper.selectById(id);
        List<ContractSubjectMatter> subjectMatterList = contractSubjectMatterMapper.selectList(Wrappers.<ContractSubjectMatter>lambdaQuery()
                .eq(ContractSubjectMatter::getContractId, id).orderByAsc(ContractSubjectMatter::getCreateTime));
        Map<String, Object> map = new HashMap<>();
        //合同基本信息
        map.put("partyA", contract.getPartyA());
        map.put("partyB", contract.getPartyB());
        map.put("contractNo", contract.getContractNo());
        map.put("signPlace", contract.getSignPlace());
        map.put("signDate", DateUtil.formatDate(contract.getSignDate()));
        map.put("signDateYMD", DateUtil.format(contract.getSignDate(), DatePattern.CHINESE_DATE_PATTERN));
        map.put("total", contract.getAmount());
        map.put("amountWords", Convert.digitToChinese(contract.getAmount()));
        map.put("deliveryCycle",contract.getDeliveryCycle());
        //标的物
        List<Map<String, Object>> items = new ArrayList<>();
        AtomicReference<Integer> no = new AtomicReference<>(0);
        subjectMatterList.stream().forEach(contractSubjectMatter -> {
            Map<String, Object> item = new HashMap<>();
            item.put("no", no);
            item.put("materialName", contractSubjectMatter.getMaterialName());
            item.put("guige", contractSubjectMatter.getSpecification());
            item.put("unit", contractSubjectMatter.getUnit());
            item.put("quantity", contractSubjectMatter.getQuantity());
            item.put("danzhong", contractSubjectMatter.getSingleWight());
            item.put("zongzhong", contractSubjectMatter.getTotalWight());
            item.put("unitPrice", contractSubjectMatter.getUnitPrice());
            item.put("price", contractSubjectMatter.getTotalAmount());
            items.add(item);
            no.updateAndGet(v -> v + 1);
        });
        map.put("items", items);
        //定制方
        BusinessCustomer customer = businessCustomerMapper.selectById(contract.getPartyAId());
        map.put("companyName", customer.getCompanyName());
        map.put("legalPerson", customer.getLegalPerson());
        map.put("contactPhone", customer.getContactPhone());
        map.put("bankName", customer.getBankName());
        map.put("bankAccount", customer.getBankAccount());
        //承揽方
        R<SysDept> r = remoteDeptService.getById(contract.getPartyBId());
        SysDept dept = r.getData();
        map.put("orgName", dept.getOrgName());
        map.put("legalPerson1", StrUtil.isNotEmpty(dept.getLegalPerson()) ? dept.getLegalPerson() : "");
        map.put("entrustedAgent", StrUtil.isNotEmpty(dept.getLegalPerson()) ? "" : dept.getEntrustedAgent());
        map.put("orgContact", dept.getOrgContact());
        map.put("orgBank", dept.getOrgBank());
        map.put("orgBankAccount", dept.getOrgBankAccount());
        //生成文件名
        Long time = new Date().getTime();
        // 生成的word格式
        String formatSuffix = ".docx";
        // 拼接后的文件名
        String fileName = time + formatSuffix;//文件名  带后缀
        //导出word
        try {
            // 1. 加载模版
            // 假设模版在 resources/templates/template.docx
            ClassPathResource resource = new ClassPathResource("template/ymj/ymjgkcpmmht.docx");
            // 配置列表策略
            Configure config = Configure.builder()
                    .bind("items", new LoopRowTableRenderPolicy()) // 将 items 绑定到行循环策略
                    .build();
            // 2. 编译并渲染数据
            XWPFTemplate xwpfTemplate = XWPFTemplate.compile(resource.getInputStream(), config).render(map);
            // 3. 设置响应头
            response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".docx");
            // 4. 写入输出流
            OutputStream out = response.getOutputStream();
            xwpfTemplate.write(out);
            out.flush();
            out.close();
            xwpfTemplate.close(); // 重要:关闭模版释放资源
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    public void exportContractYMJCGWord(Long id, HttpServletResponse response) {
        Contract contract = baseMapper.selectById(id);
        List<ContractSubjectMatter> subjectMatterList = contractSubjectMatterMapper.selectList(Wrappers.<ContractSubjectMatter>lambdaQuery()
                .eq(ContractSubjectMatter::getContractId, id).orderByAsc(ContractSubjectMatter::getCreateTime));
        Map<String, Object> map = new HashMap<>();
        //合同基本信息
        map.put("partyA", contract.getPartyA());
        map.put("partyB", contract.getPartyB());
        map.put("contractNo", contract.getContractNo());
        map.put("signPlace", contract.getSignPlace());
        map.put("signDate", DateUtil.formatDate(contract.getSignDate()));
        map.put("signDateYMD", DateUtil.format(contract.getSignDate(), DatePattern.CHINESE_DATE_PATTERN));
        map.put("total", contract.getAmount());
        map.put("amountWords", Convert.digitToChinese(contract.getAmount()));
        map.put("environment",contract.getEnvironment());
        map.put("standard",contract.getStandard());
        map.put("useMonth",contract.getUseMonth());
        map.put("afterShipMonth",contract.getAfterShipMonth());
        map.put("shipMethod",contract.getShipMethod());
        map.put("shipAddress",contract.getShipAddress());
        map.put("packaging",contract.getPackaging());
        map.put("repairPeriod",contract.getRepairPeriod());
        map.put("repairBreachAmount",contract.getRepairBreachAmount());
        map.put("goodsShort",contract.getGoodsShort());
        map.put("goodsShortBreachAmount",contract.getGoodsShortBreachAmount());
        map.put("overdueBreachAmount",contract.getOverdueBreachAmount());
        map.put("terminateContract",contract.getTerminateContract());
        map.put("court",contract.getCourt());
        map.put("contractAttchment",contract.getContractAttchment());
        map.put("invoiceNotice",contract.getInvoiceNotice());
        //标的物
        List<Map<String, Object>> items = new ArrayList<>();
        AtomicReference<Integer> no = new AtomicReference<>(0);
        subjectMatterList.stream().forEach(contractSubjectMatter -> {
            Product product = productMapper.selectOne(Wrappers.<Product>lambdaQuery().eq(Product::getErpCode,contractSubjectMatter.getMaterialCode()).last("limit 1"));
            Map<String, Object> item = new HashMap<>();
            item.put("no", no);
            item.put("materialName", contractSubjectMatter.getMaterialName());
            item.put("guige", contractSubjectMatter.getSpecification());
            item.put("unit", contractSubjectMatter.getUnit());
            item.put("quantity", contractSubjectMatter.getQuantity());
            item.put("unitPrice", contractSubjectMatter.getUnitPrice());
            item.put("priceTax", contractSubjectMatter.getUnitPrice().multiply(contractSubjectMatter.getQuantity()).setScale(2, RoundingMode.HALF_UP));
            item.put("priceNoTax", contractSubjectMatter.getUnitPrice().multiply(contractSubjectMatter.getQuantity())
                    .subtract(contractSubjectMatter.getUnitPrice().multiply(contractSubjectMatter.getQuantity())
                            .divide(new BigDecimal("100").add(new BigDecimal(product.getTaxRate())),2, RoundingMode.HALF_UP).multiply(new BigDecimal(product.getTaxRate())))
                    .setScale(2, RoundingMode.HALF_UP));
            item.put("deliveryDate", DateUtil.formatDate(contractSubjectMatter.getPlannedDeliveryDate()));
            item.put("remarks", contractSubjectMatter.getRemarks());
            map.put("taxRate",product.getTaxRate());
            items.add(item);
            no.updateAndGet(v -> v + 1);
        });
        //付款
        List<ContractPaymentSchedule> scheduleList = contractPaymentScheduleMapper.selectList(Wrappers.<ContractPaymentSchedule>lambdaQuery()
                .eq(ContractPaymentSchedule::getContractId, id).orderByAsc(ContractPaymentSchedule::getCreateTime));
        scheduleList.stream().forEach(contractPaymentSchedule -> {
            if (contractPaymentSchedule.getStageName().equals("合同签订")){
                map.put("htqdbl",contractPaymentSchedule.getPaymentRatio());
                map.put("htqdje",contractPaymentSchedule.getPlannedAmount());
                map.put("htqdjr",contractPaymentSchedule.getAgreedDays());
            }
            if (contractPaymentSchedule.getStageName().equals("发货前")){
                map.put("fhqbl",contractPaymentSchedule.getPaymentRatio());
                map.put("fhqje",contractPaymentSchedule.getPlannedAmount());
            }
            if (contractPaymentSchedule.getStageName().equals("调试完成或验收")){
                map.put("ysbl",contractPaymentSchedule.getPaymentRatio());
                map.put("ysje",contractPaymentSchedule.getPlannedAmount());
                map.put("ysjr",contractPaymentSchedule.getAgreedDays());
            }
            if (contractPaymentSchedule.getStageName().equals("质保金")){
                map.put("zbjbl",contractPaymentSchedule.getPaymentRatio());
                map.put("zbjje",contractPaymentSchedule.getPlannedAmount());
                map.put("zbjjr",contractPaymentSchedule.getAgreedDays());
            }
        });
        map.put("items", items);
        //定制方
        BusinessCustomer customer = businessCustomerMapper.selectById(contract.getPartyAId());
        map.put("companyName", customer.getCompanyName());
        map.put("legalPerson", customer.getLegalPerson());
        map.put("contactPhone", customer.getContactPhone());
        map.put("bankName", customer.getBankName());
        map.put("bankAccount", customer.getBankAccount());
        //承揽方
        R<SysDept> r = remoteDeptService.getById(contract.getPartyBId());
        SysDept dept = r.getData();
        map.put("orgName", dept.getOrgName());
        map.put("legalPerson1", StrUtil.isNotEmpty(dept.getLegalPerson()) ? dept.getLegalPerson() : "");
        map.put("entrustedAgent", StrUtil.isNotEmpty(dept.getLegalPerson()) ? "" : dept.getEntrustedAgent());
        map.put("orgContact", dept.getOrgContact());
        map.put("orgBank", dept.getOrgBank());
        map.put("orgBankAccount", dept.getOrgBankAccount());
        //生成文件名
        Long time = new Date().getTime();
        // 生成的word格式
        String formatSuffix = ".docx";
        // 拼接后的文件名
        String fileName = time + formatSuffix;//文件名  带后缀
        //导出word
        try {
            // 1. 加载模版
            // 假设模版在 resources/templates/template.docx
            ClassPathResource resource = new ClassPathResource("template/ymj/ymjcght.docx");
            // 配置列表策略
            Configure config = Configure.builder()
                    .bind("items", new LoopRowTableRenderPolicy()) // 将 items 绑定到行循环策略
                    .build();
            // 2. 编译并渲染数据
            XWPFTemplate xwpfTemplate = XWPFTemplate.compile(resource.getInputStream(), config).render(map);
            // 3. 设置响应头
            response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
            response.setCharacterEncoding("utf-8");
            response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".docx");
            // 4. 写入输出流
            OutputStream out = response.getOutputStream();
            xwpfTemplate.write(out);
            out.flush();
            out.close();
            xwpfTemplate.close(); // 重要:关闭模版释放资源
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/InvoiceServiceImpl.java
File was deleted
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/OutBoundServiceImpl.java
@@ -384,6 +384,7 @@
        contractOutBound.setOutBoundAttNames(addDTO.getOutBoundAttNames());
        contractOutBound.setOutBoundAttPaths(addDTO.getOutBoundAttPaths());
        contractOutBound.setOutBoundId(outBoundId);
        contractOutBound.setInvoiceStatus("0");
        contractOutBoundMapper.insert(contractOutBound);
        if (StrUtil.isEmpty(contract.getContractCategory())){
            if (DateUtil.compare(addDTO.getOutBoundTime(),contract.getExpirationDate())>0){
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/PaymentConfirmServiceImpl.java
@@ -465,7 +465,7 @@
                String result = HttpUtil.post(url + "/yonbip/EFI/collection/list?access_token=" + finalAccessToken, params.toJSONString());
                log.info("SK_CX Response:{}", result);
                //保存请求记录
                saveBipRequestRecord(params, result);
                saveBipRequestRecord(params,"<XSJZ_SK_CX_001>-收款单查询接口", result);
                JSONObject resultJson = JSONObject.parseObject(result);
                if (resultJson.containsKey("code") && resultJson.getString("code").equals("200")) {
                    handleAndSave(bipCode, resultJson);
@@ -493,7 +493,8 @@
        return params;
    }
    private void getAccessToken(String accessToken) {
    @Override
    public String getAccessToken(String accessToken) {
        long timestamp = System.currentTimeMillis();
        Map<String, Object> paramMap = new HashMap<>();
        paramMap.put("appKey", appKey);
@@ -514,20 +515,22 @@
        JSONObject tokenJson = JSONObject.parseObject(getTokenResult);
        if (!tokenJson.containsKey("code") || !tokenJson.getString("code").equals("200")) {
            log.error("Get access_token ERROR");
            return;
            return "";
        }
        if (ObjUtil.isNull(tokenJson.get("data")) || ObjUtil.isNull(JSONObject.parseObject(tokenJson.getString("data")))) {
            log.error("access_token value exception");
            return;
            return "";
        }
        accessToken = JSONObject.parseObject(tokenJson.getString("data")).getString("access_token");
        log.info("access_token value:", accessToken);
        redisTemplate.opsForValue().set("BIP_TOKEN", accessToken, tokenJson.getIntValue("expire") - 10, TimeUnit.SECONDS);
        return accessToken;
    }
    private void saveBipRequestRecord(JSONObject params, String result) {
    @Override
    public void saveBipRequestRecord(JSONObject params, String methodName, String result) {
        BipRequestRecord record = new BipRequestRecord();
        record.setInterfaceName("<XSJZ_SK_CX_001>-收款单查询接口");
        record.setInterfaceName(methodName);
        record.setRequestParams(params.toJSONString());
        record.setResponseParams(result);
        record.setResponseCode(JSONObject.parseObject(result).getString("code"));
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/ProductServiceImpl.java
@@ -9,6 +9,7 @@
import com.by4cloud.platformx.business.entity.Product;
import com.by4cloud.platformx.business.mapper.ProductMapper;
import com.by4cloud.platformx.business.service.ProductService;
import com.by4cloud.platformx.common.data.datascope.DataScope;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
@@ -32,9 +33,9 @@
        Long parent = parentId == null ? 0l : parentId;
        List<TreeNode<Long>> collect = baseMapper
                .selectList(Wrappers.<Product>lambdaQuery()
                .selectListByScope(Wrappers.<Product>lambdaQuery()
                        .like(StrUtil.isNotBlank(productName), Product::getProductName, productName)
                        .orderByAsc(Product::getCreateTime))
                        .orderByAsc(Product::getCreateTime), DataScope.of("comp_id"))
                .stream().map(getNodeFunction()).collect(Collectors.toList());
        // 模糊查询 不组装树结构 直接返回 表格方便编辑
platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/SaleCreditServiceImpl.java
File was deleted
platformx-business-finance-biz/src/main/resources/mapper/BillingInfoMapper.xml
File was deleted
platformx-business-finance-biz/src/main/resources/mapper/BillingItemMapper.xml
File was deleted
platformx-business-finance-biz/src/main/resources/mapper/BipInvoiceMapper.xml
File was deleted
platformx-business-finance-biz/src/main/resources/mapper/BwRequestRecordMapper.xml
New file
@@ -0,0 +1,20 @@
<?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.BwRequestRecordMapper">
  <resultMap id="bipRequestRecordMap" type="com.by4cloud.platformx.business.entity.BwRequestRecord">
        <id property="id" column="id"/>
        <result property="compId" column="comp_id"/>
        <result property="interfaceName" column="interface_name"/>
          <result property="requestId" column="request_id"/>
        <result property="requestParams" column="request_params"/>
        <result property="responseCode" column="response_code"/>
        <result property="responseParams" column="response_params"/>
        <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/ContractInvoiceMapper.xml
New file
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.by4cloud.platformx.business.mapper.ContractInvoiceMapper">
  <resultMap id="ContractInvoiceMap" type="com.by4cloud.platformx.business.entity.ContractInvoice">
        <id property="id" column="id"/>
        <result property="compId" column="comp_id"/>
        <result property="contractId" column="contract_id"/>
        <result property="invoicePrice" column="invoice_price"/>
        <result property="invoiceTime" column="invoice_time"/>
        <result property="invoicePath" column="invoice_path"/>
          <result property="invoiceCategory" column="invoice_category"/>
        <result property="redReversal" column="red_reversal"/>
        <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/FileBipMapper.xml
File was deleted
platformx-business-finance-biz/src/main/resources/mapper/FpInvoiceResultItemMapper.xml
File was deleted
platformx-business-finance-biz/src/main/resources/mapper/FpInvoiceResultMapper.xml
File was deleted
platformx-business-finance-biz/src/main/resources/mapper/SaleCreditMapper.xml
File was deleted
platformx-business-finance-biz/src/main/resources/template/ymj/ymjcght.docx
Binary files differ
platformx-business-finance-biz/src/main/resources/template/ymj/ymjgkcpmmht.docx
Binary files differ
platformx-business-finance-biz/src/main/resources/template/ymj/ymjgypmmht.docx
Binary files differ
platformx-business-finance-biz/src/main/resources/template/ymj/ymjjgclht.docx
Binary files differ