金财数科接口合并销项:DTO

beta-prop-all
dongxiaoke 2 years ago
parent 4070796ec9
commit 7c7640f9ad
  1. 36
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/CxhzDTO.java
  2. 51
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/CxhzJsonDataDTO.java
  3. 42
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/FileAcquisitionDTO.java
  4. 30
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/FileAcquisitionDetailDTO.java
  5. 36
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/FileAcquisitionOnDTO.java
  6. 31
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/FileAcquisitionOnDetailDTO.java
  7. 42
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/KshcDTO.java
  8. 45
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/QueryDTO.java
  9. 35
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/ShhzDTO.java
  10. 30
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/ShhzJsonDataDTO.java
  11. 36
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/SqhzDTO.java
  12. 64
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/SqhzJsonDataDTO.java
  13. 57
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/SqhzJsonDataDetailDTO.java
  14. 31
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/YhdjDTO.java
  15. 40
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/YhdjDetailDTO.java
  16. 113
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/add/InvoiceAllAddDTO.java
  17. 131
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/add/InvoiceAllAddInfoDTO.java
  18. 22
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/add/InvoiceAllAddextDTO.java
  19. 26
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/add/InvoiceAllAddfjxxListDTO.java
  20. 63
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/add/InvoiceAllAddmxListDTO.java
  21. 22
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/add/InvoiceAllAddtdywxxDTO.java
  22. 46
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/add/InvoiceAllAddtdywxxbdcjyzlfwDTO.java
  23. 39
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/add/InvoiceAllAddtdywxxjzfwDTO.java
  24. 28
      jianshui-invoice/src/main/java/com/jianshui/invoice/domain/dto/jcsk/red/AddRedInvoiceDTO.java
  25. 228
      jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/request/JcskInvoiceRequestAdapterImpl.java
  26. 246
      jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/adapter/response/JcskInvoiceResponseAdapterImpl.java
  27. 716
      jianshui-invoice/src/main/java/com/jianshui/invoice/service/impl/api/JcskInvoiceApiServiceImpl.java

@ -0,0 +1,36 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 查询红字信息表
* @author dxk
* @date 2022年12月09日 17:16
*/
@Data
public class CxhzDTO {
@NotEmpty
@ApiModelProperty(value = "true")
private String async;
@NotEmpty
@ApiModelProperty(value = "办税人身份证号")
private String bsrysfzjhm;
@NotEmpty
@ApiModelProperty(value = "地区编码(参考码表)")
private String dqbm;
@NotEmpty
@ApiModelProperty(value = "纳税人识别号")
private String nsrsbh;
private CxhzJsonDataDTO jsonData;
}

@ -0,0 +1,51 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 查询红字信息表
* @author dxk
* @date 2022年12月09日 17:16
*/
@Data
public class CxhzJsonDataDTO {
@NotEmpty
@ApiModelProperty(value = "申请来源")
private String sqly;
@NotEmpty
@ApiModelProperty(value = "开票日期起")
private String kprqq;
@NotEmpty
@ApiModelProperty(value = "开票日期止")
private String kprqz;
@NotEmpty
@ApiModelProperty(value = "红字发票信息确认单id")
private String hzfpxxqrdid;
@NotEmpty
@ApiModelProperty(value = "红字发票信息确认单编号")
private String hzfpxxqrdbh;
@NotEmpty
@ApiModelProperty(value = "蓝字发票号码")
private String lzfphm;
@NotEmpty
@ApiModelProperty(value = "每页条数")
private String pageSize;
@NotEmpty
@ApiModelProperty(value = "页数")
private String pageNumber;
}

@ -0,0 +1,42 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 通用查询接口DTO
*
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class FileAcquisitionDTO {
@NotEmpty
@ApiModelProperty(value = "true")
private String async;
@NotEmpty
@ApiModelProperty(value = "办税人身份证号")
private String bsrysfzjhm;
@NotEmpty
@ApiModelProperty(value = "*地区编码(参考码表)")
private String dqbm;
@NotEmpty
@ApiModelProperty(value = "*纳税人识别号")
private String nsrsbh;
@NotEmpty
@ApiModelProperty(value = "全电发票号码")
private String fphm;
@NotEmpty
@ApiModelProperty(value = "开票日期,格式:yyyyMMddHHmmss\t")
private String kprq;
}

@ -0,0 +1,30 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 通用查询接口DTO
*
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class FileAcquisitionDetailDTO {
@NotEmpty
@ApiModelProperty(value = "全电发票号码")
private String fphm;
@NotEmpty
@ApiModelProperty(value = "开票日期")
private String kprq;
@NotEmpty
@ApiModelProperty(value = "文件格式")
private String wjgs;
}

@ -0,0 +1,36 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 全电发票文件获取
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class FileAcquisitionOnDTO {
@NotEmpty
@ApiModelProperty(value = "true")
private String async;
@NotEmpty
@ApiModelProperty(value = "办税人身份证号")
private String bsrysfzjhm;
@NotEmpty
@ApiModelProperty(value = "*地区编码(参考码表)")
private String dqbm;
@NotEmpty
@ApiModelProperty(value = "*纳税人识别号")
private String nsrsbh;
private FileAcquisitionOnDetailDTO jsonData;
}

@ -0,0 +1,31 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 全电发票文件获取
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class FileAcquisitionOnDetailDTO {
@NotEmpty
@ApiModelProperty(value = "发票号码")
private String fphm;
@NotEmpty
@ApiModelProperty(value = "开票日期")
private String kprq;
@NotEmpty
@ApiModelProperty(value = "文件格式")
private String wjgs;
}

@ -0,0 +1,42 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 快速红冲
*/
@Data
public class KshcDTO {
@NotEmpty
@ApiModelProperty(value = "办税人身份证号")
private String bsrysfzjhm;
@NotEmpty
@ApiModelProperty(value = "地区编码(参考码表)")
private String dqbm;
@ApiModelProperty(value = "true本接口不支持同步")
@NotEmpty
private Boolean async;
@NotEmpty
@ApiModelProperty(value = "纳税人识别号")
private String nsrsbh;
@ApiModelProperty(value = "冲红原因代码")
@NotEmpty
private String chyydm;
@NotEmpty
@ApiModelProperty(value = "原发票号码")
private String yfphm;
}

@ -0,0 +1,45 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 通用查询接口DTO
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class QueryDTO {
@NotEmpty
@ApiModelProperty(value = "渠道标识")
private String appkey;
@NotEmpty
@ApiModelProperty(value = "地区编码")
private String dqbm;
@NotEmpty
@ApiModelProperty(value = "false")
private String async;
@NotEmpty
@ApiModelProperty(value = "办税人身份证号")
private String bsrysfzjhm;
@NotEmpty
@ApiModelProperty(value = "纳税人识别号")
private String nsrsbh;
@NotEmpty
@ApiModelProperty(value = "任务id")
private String requestId;
@NotEmpty
@ApiModelProperty(value = "tycxjk")
private String serviceId;
}

@ -0,0 +1,35 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 审核红字信息表
* @author dxk
* @date 2022年12月09日 17:16
*/
@Data
public class ShhzDTO {
@NotEmpty
@ApiModelProperty(value = "true")
private String async;
@NotEmpty
@ApiModelProperty(value = "办税人身份证号")
private String bsrysfzjhm;
@NotEmpty
@ApiModelProperty(value = "*地区编码(参考码表)")
private String dqbm;
@NotEmpty
@ApiModelProperty(value = "*纳税人识别号")
private String nsrsbh;
private ShhzJsonDataDTO jsonData;
}

@ -0,0 +1,30 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 审核红字信息表
* @author dxk
* @date 2022年12月09日 17:16
*/
@Data
public class ShhzJsonDataDTO {
@NotEmpty
@ApiModelProperty(value = "确认类型")
private String qrlx;
@NotEmpty
@ApiModelProperty(value = "红字发票信息确认单id")
private String hzfpxxqrdid;
@NotEmpty
@ApiModelProperty(value = "销方纳税人识别号")
private String xsfnsrsbh;
}

@ -0,0 +1,36 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 申请红字信息表
* @author dxk
* @date 2022年12月09日 17:16
*/
@Data
public class SqhzDTO {
@NotEmpty
@ApiModelProperty(value = "true")
private String async;
@NotEmpty
@ApiModelProperty(value = "办税人身份证号")
private String bsrysfzjhm;
@NotEmpty
@ApiModelProperty(value = "*地区编码(参考码表)")
private String dqbm;
@NotEmpty
@ApiModelProperty(value = "纳税人识别号")
private String nsrsbh;
private SqhzJsonDataDTO jsonData;
}

@ -0,0 +1,64 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
* 申请红字信息表
* @author dxk
* @date 2022年12月09日 17:16
*/
@Data
public class SqhzJsonDataDTO {
@NotEmpty
@ApiModelProperty(value = "冲红原因代码")
private String chyydm;
@NotEmpty
@ApiModelProperty(value = "购买方纳税人识别号")
private String gmfnsrsbh;
@NotEmpty
@ApiModelProperty(value = "红字合计金额")
private String hzcxje;
@NotEmpty
@ApiModelProperty(value = "红字合计税额")
private String hzcxse;
@NotEmpty
@ApiModelProperty(value = "申请来源")
private String sqly;
@NotEmpty
@ApiModelProperty(value = "特定要素类型代码(参考码表)")
private String tdyslxdm;
@NotEmpty
@ApiModelProperty(value = "销售方纳税人识别号")
private String xsfnsrsbh;
@NotEmpty
@ApiModelProperty(value = "原发票号码")
private String yfphm;
@NotEmpty
@ApiModelProperty(value = "原开票日期")
private String ykprq;
@NotEmpty
@ApiModelProperty(value = "原纸质发票代码")
private String yzzfpdm;
@NotEmpty
@ApiModelProperty(value = "原纸质发票号码")
private String yzzfphm;
private List<SqhzJsonDataDetailDTO> hzqrxxmxlist;
}

@ -0,0 +1,57 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 申请红字信息表
* @author dxk
* @date 2022年12月09日 17:16
*/
@Data
public class SqhzJsonDataDetailDTO {
@NotEmpty
@ApiModelProperty(value = "单价")
private String dj;
@NotEmpty
@ApiModelProperty(value = "单位")
private String dw;
@NotEmpty
@ApiModelProperty(value = "规格型号")
private String ggxh;
@NotEmpty
@ApiModelProperty(value = "金额")
private String je;
@NotEmpty
@ApiModelProperty(value = "蓝字明细序号")
private String lzmxxh;
@NotEmpty
@ApiModelProperty(value = "税额")
private String se;
@NotEmpty
@ApiModelProperty(value = "数量")
private String sl;
@NotEmpty
@ApiModelProperty(value = "税率")
private String slv;
@NotEmpty
@ApiModelProperty(value = "商品编码")
private String spbm;
@NotEmpty
@ApiModelProperty(value = "商品名称")
private String xmmc;
}

@ -0,0 +1,31 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author dxk
* @date 2022年12月09日 17:16
*/
@Data
public class YhdjDTO {
@ApiModelProperty(value = "渠道标识")
private String appkey;
@ApiModelProperty(value = "false")
private Boolean async;
@ApiModelProperty(value = "yhdj")
private String serviceId;
@ApiModelProperty(value = "办税人身份证号")
private String bsrysfzjhm;
@ApiModelProperty(value = "*地区编码(参考码表)")
private String dqbm;
@ApiModelProperty(value = "*纳税人识别号")
private String nsrsbh;
YhdjDetailDTO jsonData;
}

@ -0,0 +1,40 @@
package com.jianshui.invoice.domain.dto.jcsk;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author dxk
* @date 2022年12月09日 17:16
*/
@Data
public class YhdjDetailDTO {
@ApiModelProperty(value = "*办税人员姓名(税局实名认证的人员)")
private String bsryxm;
@ApiModelProperty(value = "*登录身份(1:财务负责人,2:法定代表人,3:办税人,4:购票员,5:普通管理员,99:其他) 备注:如果选择99|其他,则办税人员名称、手机号码、身份证件号码.可以不传")
private String dlsf;
@ApiModelProperty(value = "*办税人员登录密码")
private String dlsfmm;
@ApiModelProperty(value = "*登录方式(参考码表)")
private String dlfs;
@ApiModelProperty(value = "*登录密码")
private String dlmm;
@ApiModelProperty(value = "*登录账号")
private String dlzh;
@ApiModelProperty(value = "*纳税人名称")
private String nsrmc;
@ApiModelProperty(value = "*纳税人识别号")
private String nsrsbh;
@ApiModelProperty(value = "*办税人员身份证件号码(税局实名认证的人员)")
private String bsrysfzjhm;
@ApiModelProperty(value = "*办税人员手机号码(税局实名认证的人员)")
private String bsrysjhm;
@ApiModelProperty(value = "中间号码")
private String zjh;
@ApiModelProperty(value = "*登陆标志1 新版")
private String loginType;
}

@ -0,0 +1,113 @@
package com.jianshui.invoice.domain.dto.jcsk.add;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 发票开具 1 DTO
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class InvoiceAllAddDTO {
@ApiModelProperty(value = "渠道标识")
private String appkey;
@NotEmpty
@ApiModelProperty(value = "true")
private String async;
@NotEmpty
@ApiModelProperty(value = "办税人身份证号")
private String bsrysfzjhm;
@NotEmpty
@ApiModelProperty(value = "*地区编码(参考码表)")
private String dqbm;
@NotEmpty
@ApiModelProperty(value = "*纳税人识别号")
private String nsrsbh;
@NotEmpty
@ApiModelProperty(value = "lzfpkj")
private String serviceId;
InvoiceAllAddInfoDTO jsonData;
// 2023/3/9 新增字段
@ApiModelProperty(value = "放弃享受减按1%征收率原因")
private String kjlx;
@ApiModelProperty(value = "出行人")
private String cxr;
@ApiModelProperty(value = "出行人证件类型")
private String cxrzjlx;
@ApiModelProperty(value = "出行人证件号码")
private String cxrzjhm;
@ApiModelProperty(value = "出行日期")
private String cxrq;
@ApiModelProperty(value = "出发地")
private String cfd;
@ApiModelProperty(value = "到达地")
private String ddd;
@ApiModelProperty(value = "交通工具类型")
private String jtgjlx;
@ApiModelProperty(value = "等级")
private String dengj;
@ApiModelProperty(value = "货物运输服务")
private String hwysfw;
@ApiModelProperty(value = "起运地")
private String qyd;
@ApiModelProperty(value = "运输工具号牌")
private String ysgjhp;
@ApiModelProperty(value = "运输工具种类")
private String ysgjzl;
@ApiModelProperty(value = "运输货物名称")
private String yshwmc;
}

@ -0,0 +1,131 @@
package com.jianshui.invoice.domain.dto.jcsk.add;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
* 发票开具 2 DTO
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class InvoiceAllAddInfoDTO {
@ApiModelProperty(value = "备注")
private String bz;
@NotEmpty
@ApiModelProperty(value = "发票类型代码")
private String fplxdm;
@NotEmpty
@ApiModelProperty(value = "发票请求流水号")
private String fpqqlsh;
@ApiModelProperty(value = "购方信息确认")
private String gfxxconfirm;
@NotEmpty
@ApiModelProperty(value = "购买方地址")
private String gmfdz;
@NotEmpty
@ApiModelProperty(value = "购买方开户行")
private String gmfkhh;
@NotEmpty
@ApiModelProperty(value = "购买方联系电话")
private String gmflxdh;
@NotEmpty
@ApiModelProperty(value = "购买方名称")
private String gmfmc;
@NotEmpty
@ApiModelProperty(value = "购买方税号")
private String gmfnsrsbh;
@NotEmpty
@ApiModelProperty(value = "购买方银行账号")
private String gmfyhzh;
@NotEmpty
@ApiModelProperty(value = "合计金额")
private String hjje;
@NotEmpty
@ApiModelProperty(value = "合计税额")
private String hjse;
@NotEmpty
@ApiModelProperty(value = "含税标志 1-不含税 2-含税")
private String hsbz;
@NotEmpty
@ApiModelProperty(value = "经办人姓名")
private String jbrxm;
@NotEmpty
@ApiModelProperty(value = "经办人证件号码")
private String jbrzjhm;
@NotEmpty
@ApiModelProperty(value = "经办人证件种类代码")
private String jbrzjzldm;
@NotEmpty
@ApiModelProperty(value = "经办人纳税人识别号")
private String jrznsrsbh;
@NotEmpty
@ApiModelProperty(value = "价税合计")
private String jshj;
@ApiModelProperty(value = "")
private String kjly;
// 特定业务必填
// @NotEmpty
@ApiModelProperty(value = "特定要素类型代码")
private String tdyslxdm;
@NotEmpty
@ApiModelProperty(value = "销方地址")
private String xsfdz;
@NotEmpty
@ApiModelProperty(value = "销方开户行")
private String xsfkhh;
@NotEmpty
@ApiModelProperty(value = "销方联系电话")
private String xsflxdh;
@NotEmpty
@ApiModelProperty(value = "销方名称")
private String xsfmc;
@NotEmpty
@ApiModelProperty(value = "销方税号")
private String xsfnsrsbh;
@NotEmpty
@ApiModelProperty(value = "销方银行账号")
private String xsfyhzh;
List<InvoiceAllAddfjxxListDTO> fjxxList;
List<InvoiceAllAddmxListDTO> mxList;
List<InvoiceAllAddtdywxxDTO> tdywxx;
List<InvoiceAllAddextDTO> ext;
}

@ -0,0 +1,22 @@
package com.jianshui.invoice.domain.dto.jcsk.add;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 发票开具 1 DTO
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class InvoiceAllAddextDTO {
@NotEmpty
@ApiModelProperty(value = "0")
private String zdhqbsdz;
}

@ -0,0 +1,26 @@
package com.jianshui.invoice.domain.dto.jcsk.add;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 发票开具 1 DTO
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class InvoiceAllAddfjxxListDTO {
@NotEmpty
@ApiModelProperty(value = "附加信息名称")
private String fjxxmc;
@NotEmpty
@ApiModelProperty(value = "附加信息内容")
private String fjxxnr;
}

@ -0,0 +1,63 @@
package com.jianshui.invoice.domain.dto.jcsk.add;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 发票开具 1 DTO
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class InvoiceAllAddmxListDTO {
@NotEmpty
@ApiModelProperty(value = "单价")
private String dj;
@NotEmpty
@ApiModelProperty(value = "单位")
private String dw;
@NotEmpty
@ApiModelProperty(value = "发票行性质")
private String fphxz;
@ApiModelProperty(value = "规格型号")
private String ggxh;
@NotEmpty
@ApiModelProperty(value = "金额")
private String je;
@NotEmpty
@ApiModelProperty(value = "税额")
private String se;
@NotEmpty
@ApiModelProperty(value = "税率")
private String slv;
@NotEmpty
@ApiModelProperty(value = "商品数量")
private String spsl;
@NotEmpty
@ApiModelProperty(value = "税收分类编码")
private String ssflbm;
@ApiModelProperty(value = "特定征税方式代码")
private String tdzsfsdm;
@NotEmpty
@ApiModelProperty(value = "项目名称")
private String xmmc;
@ApiModelProperty(value = "税收优惠政策类型代码")
private String zzstsgldm;
}

@ -0,0 +1,22 @@
package com.jianshui.invoice.domain.dto.jcsk.add;
import lombok.Data;
import java.util.List;
/**
* 发票开具 1 DTO
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class InvoiceAllAddtdywxxDTO {
List<InvoiceAllAddtdywxxjzfwDTO> jzfw;
List<InvoiceAllAddtdywxxbdcjyzlfwDTO> bdcjyzlfw;
}

@ -0,0 +1,46 @@
package com.jianshui.invoice.domain.dto.jcsk.add;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 发票开具 1 DTO
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class InvoiceAllAddtdywxxbdcjyzlfwDTO {
@NotEmpty
@ApiModelProperty(value = "房屋产权证书/不动产权证号码")
private String fwcqzshm;
@NotEmpty
@ApiModelProperty(value = "不动产地址")
private String bdcdz;
@NotEmpty
@ApiModelProperty(value = "不动产详细地址")
private String bdcxxdz;
@NotEmpty
@ApiModelProperty(value = "租赁期起")
private String zlqq;
@NotEmpty
@ApiModelProperty(value = "租赁期止")
private String zlqz;
@NotEmpty
@ApiModelProperty(value = "跨地市标志")
private String kdsbz;
@NotEmpty
@ApiModelProperty(value = "面积单位")
private String mjdw;
}

@ -0,0 +1,39 @@
package com.jianshui.invoice.domain.dto.jcsk.add;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
/**
* 发票开具 1 DTO
* @author kk
* @date 2022年12月09日 17:16
*/
@Data
public class InvoiceAllAddtdywxxjzfwDTO {
@NotEmpty
@ApiModelProperty(value = "建筑服务发生地")
private String jzfwfsd;
@NotEmpty
@ApiModelProperty(value = "发生地详细地址")
private String fsdxxdz;
@NotEmpty
@ApiModelProperty(value = "建筑项目名称")
private String jzxmmc;
@NotEmpty
@ApiModelProperty(value = "跨地市标志")
private String kdsbz;
@NotEmpty
@ApiModelProperty(value = "土地增值税项目编号")
private String tdzzsxmbh;
}

@ -0,0 +1,28 @@
package com.jianshui.invoice.domain.dto.jcsk.red;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
@Data
public class AddRedInvoiceDTO {
@NotEmpty(message = "发票类型代码不能为空")
private String fplxdm; // 发票类型代码
@NotEmpty(message = "发票请求流水号不能为空")
private String fpqqlsh; // 发票请求流水号
@NotEmpty(message = "原发票类型代码不能为空")
private String yfplxdm; // 原发票类型代码
@NotEmpty(message = "原全电发票号码不能为空")
private String yfphm; // 原全电发票号码
@NotEmpty(message = "红字发票信息确认单id不能为空")
private String hzfpxxqrdid; // 红字发票信息确认单id
@NotEmpty(message = "销方税号不能为空")
private String xsfnsrsbh; // 销方税号
private String ytdyslxdm; // 原特定要素类型代码
}

@ -0,0 +1,228 @@
package com.jianshui.invoice.service.impl.adapter.request;
import com.alibaba.fastjson.JSONObject;
import com.jianshui.common.core.domain.entity.Companyservice;
import com.jianshui.common.enums.ErrorCode;
import com.jianshui.common.exception.jianshui.JianshuiParamErrorException;
import com.jianshui.common.utils.IdcardUtils;
import com.jianshui.common.utils.StringUtils;
import com.jianshui.common.utils.encrypt.AisinoInvoiceDecryptUtil;
import com.jianshui.invoice.domain.BillDetail;
import com.jianshui.invoice.domain.BillInfo;
import com.jianshui.invoice.domain.Redinfo;
import com.jianshui.invoice.domain.Redinfodetail;
import com.jianshui.invoice.domain.dto.DownloadRedInfoDTO;
import com.jianshui.invoice.domain.dto.adapter.request.aisino_jn.HxBillDetailDTO;
import com.jianshui.invoice.domain.dto.adapter.request.aisino_jn.HxBillInfoDTO;
import com.jianshui.invoice.domain.dto.adapter.request.aisino_jn.HxRedInfoDTO;
import com.jianshui.invoice.domain.dto.adapter.request.aisino_jn.HxRedInfoDetailsDTO;
import com.jianshui.invoice.service.IInvoiceRequestService;
import com.jianshui.system.service.ICompanyserviceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
/**
* @Description 航信入口报文适配器
* @Author 巩权林
* @Date 2022/3/19 21:28
**/
@Slf4j
@Component("jn_jcsk_invoice_request_adapter")
public class JcskInvoiceRequestAdapterImpl implements IInvoiceRequestService {
@Autowired
private ICompanyserviceService companyserviceService;
/**
* 解密函数
*
* @param request
* @param companyservice
* @return
*/
@Override
public JSONObject decrypt(HttpServletRequest request, Companyservice companyservice, String serviceKey) {
// 根据servletRequest获取原始请求报文
// String rawInput = HttpHelper.getBodyString(request);
// if (StringUtils.isEmpty(rawInput)) {
// throw new JianshuiParamErrorException(ErrorCode.EMPTY_PARAMS,"invoice);
// }
// JSONObject rawJson = JSONObject.parseObject(rawInput);
// 因为航信的报文都是Form,所以这里要按form的来
//方式一:getParameterMap(),获得请求参数map
Map<String, String[]> map = request.getParameterMap();
//参数名称
Set<String> key = map.keySet();
//参数迭代器
Iterator<String> iterator = key.iterator();
// JSONObject rawJson = JSONObject.parseObject(JSONObject.toJSONString(params));
JSONObject rawJson = new JSONObject();
while (iterator.hasNext()) {
String k = iterator.next();
rawJson.put(k, map.get(k)[0]);
}
if (StringUtils.isEmpty(rawJson)) {
throw new JianshuiParamErrorException(ErrorCode.ERROR_PARAMS, companyservice, "invoice");
}
String order = rawJson.getString("order");
String identity = rawJson.getString("identity");
log.info("【航信转invoice请求适配器】客户请求报文原始数据:{},销方id:{},serviceKey:{}", rawJson, companyservice.getCompanyid(), serviceKey);
// 开始解析报文
if (order == null || "".equals(order.trim())) {
throw new JianshuiParamErrorException(ErrorCode.ERROR_PARAMS, companyservice, "invoice");
}
String JKey = companyservice.getSecret(); // 解密用的secret
if (StringUtils.isEmpty(JKey)) {
throw new JianshuiParamErrorException(ErrorCode.IDENTITY_NOT_SET, companyservice, "jcsk");
}
// 平台解密
try {
order = AisinoInvoiceDecryptUtil.decrypt(order, JKey);
} catch (Exception e) {
e.printStackTrace();
throw new JianshuiParamErrorException(ErrorCode.DECRYPT_ERROR, companyservice, "jcsk");
}
log.info("销项报文:identity=" + identity + ",order=" + order);
// 报文内容体
JSONObject json = new JSONObject();
try {
// 根据用户封装参数进行区别处理
JSONObject orderJson = JSONObject.parseObject(order);
String myIdentity = orderJson.getString("identity");
if (myIdentity != null) {
// order里面有identity的情况,取出来order
JSONObject tempJson = new JSONObject();
tempJson = orderJson.getJSONObject("order");
if (tempJson != null) {
orderJson = tempJson;
}
}
json = orderJson;
// 如果是开票或者查询
if (StringUtils.equals(serviceKey, "add") || StringUtils.equals(serviceKey, "query")) {
// 开始把航信报文转成billInfo
HxBillInfoDTO hxBillInfo = json.toJavaObject(HxBillInfoDTO.class);
BillInfo billInfo = new BillInfo();
BeanUtils.copyProperties(hxBillInfo, billInfo);
if(StringUtils.isNotEmpty(hxBillInfo.getEmail())){
billInfo.setBuyerEmail(hxBillInfo.getEmail());
}
if (StringUtils.isEmpty(billInfo.getBuyerBank()) && StringUtils.isNotEmpty(billInfo.getBuyerAccount())) {
String bankNo = IdcardUtils.getBankNo(billInfo.getBuyerAccount());
if (StringUtils.isNotEmpty(bankNo)) {
String raw = billInfo.getBuyerAccount();
billInfo.setBuyerAccount(bankNo);
billInfo.setBuyerBank(raw.replace(bankNo, ""));
}
}
// 处理detail
List<HxBillDetailDTO> hxBillDetailList = hxBillInfo.getDetail();
List<BillDetail> detailList = new ArrayList<>();
if (hxBillDetailList != null && hxBillDetailList.size() > 0) {
for (HxBillDetailDTO detial : hxBillDetailList) {
BillDetail temp = new BillDetail();
BeanUtils.copyProperties(detial, temp);
detailList.add(temp);
}
billInfo.setBillDetailList(detailList);
}
if (StringUtils.isEmpty(billInfo.getBuyerBank()) && StringUtils.isNotEmpty(billInfo.getBuyerAccount())) {
String bankNo = IdcardUtils.getBankNo(billInfo.getBuyerAccount());
if (StringUtils.isNotEmpty(bankNo)) {
String raw = billInfo.getBuyerAccount();
billInfo.setBuyerAccount(bankNo);
billInfo.setBuyerBank(raw.replace(bankNo, ""));
}
}
// 处理销方信息
if (StringUtils.isEmpty(billInfo.getSellerBank()) && StringUtils.isNotEmpty(billInfo.getSellerAccount())) {
String bankNo = IdcardUtils.getBankNo(billInfo.getSellerAccount());
if (StringUtils.isNotEmpty(bankNo)) {
String raw = billInfo.getSellerAccount();
billInfo.setSellerAccount(bankNo);
billInfo.setSellerBank(raw.replace(bankNo, ""));
}
}
json = (JSONObject) JSONObject.toJSON(billInfo);
}
// 如果是redinfo
if (StringUtils.equals(serviceKey, "add_redinfo")) {
// 开始把航信报文转成billInfo
HxRedInfoDTO hxBillInfo = json.toJavaObject(HxRedInfoDTO.class);
Redinfo billInfo = new Redinfo();
BeanUtils.copyProperties(hxBillInfo, billInfo);
// 处理detail
List<HxRedInfoDetailsDTO> hxBillDetailList = hxBillInfo.getRedinfodetailList();
List<Redinfodetail> detailList = new ArrayList<>();
for (int i = 0; i < hxBillDetailList.size(); i++) {
HxRedInfoDetailsDTO detial = hxBillDetailList.get(i);
Redinfodetail temp = new Redinfodetail();
BeanUtils.copyProperties(detial, temp);
temp.setIndex(i);
detailList.add(temp);
}
billInfo.setRedinfodetailList(detailList);
json = (JSONObject) JSONObject.toJSON(billInfo);
}
// 如果是发票作废
if (StringUtils.equals(serviceKey, "deprecate")) {
return json;
}
// 如果是红字信息表下载
if (StringUtils.equals(serviceKey, "download_redinfo")) {
DownloadRedInfoDTO downloadRedInfoDTO = json.toJavaObject(DownloadRedInfoDTO.class);
json = (JSONObject) JSONObject.toJSON(downloadRedInfoDTO);
return json;
}
// 如果是发票打印
if (StringUtils.equals(serviceKey, "batch_print")) {
// JSONArray detail = json.getJSONArray("dyfpxx");
// for (int i = 0; i < detail.size(); i++) {
// JSONObject temp = (JSONObject) detail.get(i);
// String fplxdm = ElephantUtils.transElephantType(temp.getString("fpzldm"), 1);
// temp.put("fpzldm", fplxdm);
// detail.set(i, temp);
// }
return json;
}
} catch (JianshuiParamErrorException e) {
throw e;
} catch (Exception e) {
e.printStackTrace();
throw new JianshuiParamErrorException(ErrorCode.DECRYPT_ERROR, companyservice, "invoice");
}
return json;
}
@Override
public String covertMethodName(String method) {
return null;
}
}

@ -0,0 +1,246 @@
package com.jianshui.invoice.service.impl.adapter.response;
import com.alibaba.fastjson.JSONObject;
import com.jianshui.common.core.domain.AjaxResult;
import com.jianshui.common.core.domain.entity.Companyservice;
import com.jianshui.common.exception.jianshui.JianshuiParamErrorException;
import com.jianshui.common.utils.DictUtils;
import com.jianshui.common.utils.StringUtils;
import com.jianshui.common.utils.bean.BeanUtils;
import com.jianshui.invoice.domain.BillInfo;
import com.jianshui.invoice.domain.Invoice;
import com.jianshui.invoice.domain.InvoiceDetail;
import com.jianshui.invoice.domain.Redinfo;
import com.jianshui.invoice.domain.dto.HXResponse;
import com.jianshui.invoice.domain.dto.adapter.response.aisino_jn.AisinoJnInvoiceDetailResponse;
import com.jianshui.invoice.domain.dto.adapter.response.aisino_jn.AisinoJnInvoiceResponse;
import com.jianshui.invoice.service.IInvoiceResponseService;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
/**
* @Description 航信出口报文适配器
* @Author 巩权林
* @Date 2022/3/19 21:28
**/
@Component("jn_jcsk_invoice_response_adapter")
public class JcskInvoiceResponseAdapterImpl implements IInvoiceResponseService {
@Override
public JSONObject response(HXResponse result, Companyservice companyservice, String query) {
// 如果是开具
if (StringUtils.equals("add", query)) {
return result;
}
// 如果是发票查询
if (StringUtils.equals("query", query)) {
// 判断有无data
Object datas = result.getData();
// 如果datas不为Null
if (datas != null) {
// 如果返回将诶过为invioce
List<AisinoJnInvoiceResponse> responses = new ArrayList<>();
if (datas instanceof List) {
for (int ij = 0; ij < ((List<?>) datas).size(); ij++) {
Object data = ((List<?>) datas).get(ij);
// 转为HxInvoice
Invoice invoice = (Invoice) data;
if (invoice == null) {
continue;
}
AisinoJnInvoiceResponse invoiceResponse = new AisinoJnInvoiceResponse();
BeanUtils.copyProperties(invoice, invoiceResponse);
String invoiceType = DictUtils.getDictLabel("invoice_type", invoice.getInvoiceType());
if (invoiceType != null) {
invoiceResponse.setInvoiceType(invoiceType);
}
// 处理发票状态
// 处理Detail
List<InvoiceDetail> detailList = invoice.getInvoiceDetailList();
if (detailList != null) {
List<AisinoJnInvoiceDetailResponse> invoiceDetailResponses = new ArrayList<>();
for (int i = 0; i < detailList.size(); i++) {
AisinoJnInvoiceDetailResponse response = new AisinoJnInvoiceDetailResponse();
InvoiceDetail tempDetail = detailList.get(i);
BeanUtils.copyProperties(tempDetail, response);
Integer hsbz = tempDetail.getHsbz();
if (hsbz == 0) {
response.setHsbz("false");
response.setTaxamt(null);
// 如果不含税
} else {
// 如果含税
response.setHsbz("true");
response.setTaxfreeamt(response.getTaxamt());
}
invoiceDetailResponses.add(response);
}
invoiceResponse.setInvoiceDetailList(invoiceDetailResponses);
}
responses.add(invoiceResponse);
}
JSONObject queryResult = new JSONObject();
queryResult.put("result", result.getMessage());
queryResult.put("list", responses);
return queryResult;
}
}
JSONObject queryResult = new JSONObject();
queryResult.put("result", result.getMessage());
queryResult.put("list", new ArrayList<>());
}
// 如果是开具红票
if (StringUtils.equals("add_redinfo", query)) {
return result;
}
// 如果是下载红票
if (StringUtils.equals("download_redinfo", query)) {
Object datas = result.getData();
// 如果datas不为Null
if (datas != null) {
// 如果返回将诶过为invioce
// List<AisinoJnInvoiceResponse> responses = new ArrayList<>();
// if (datas instanceof List) {
// }
}
return result;
}
// 如果是打印
if (StringUtils.equals("printer", query)) {
Object datas = result.getData();
// 如果datas不为Null
if (datas != null) {
// 如果返回将诶过为invioce
// List<AisinoJnInvoiceResponse> responses = new ArrayList<>();
// if (datas instanceof List) {
// }
}
return result;
}
// 作废查询
if (StringUtils.equals("deprecate_query", query)) {
Object datas = result.getData();
if (datas != null) {
JSONObject dataJson = (JSONObject) datas;
// String status = dataJson.getString("status");
JSONObject result2 = new JSONObject();
result2.put("message", "操作完成");
result2.put("status", "0000");
result2.put("data", dataJson);
// if (StringUtils.equals(status, "3")) {
// result2.put("code", "0000");
// result2.put("msg", "作废成功");
// } else if (StringUtils.equals(status, "1")) {
// result2.put("code", "9998");
// result2.put("msg", "作废中");
// } else {
// result2.put("code", "9998");
// result2.put("msg", "作废失败");
// }
return result2;
}
}
if (StringUtils.equals("sign_e_seal", query)) {
AjaxResult resp = AjaxResult.success();
Object data = result.getData();
if (!StringUtils.equals("0000", result.getStatus())) {
resp = AjaxResult.error(result.getMessage());
return JSONObject.parseObject(JSONObject.toJSONString(resp));
}
JSONObject dataJson = (JSONObject) data;
if (StringUtils.equals("0000", dataJson.getString("CODE"))) {
// result.put("code", "200");
// result.put("data", dataJson.getJSONObject("data"));
resp.put("data", dataJson.getJSONObject("DATA"));
return JSONObject.parseObject(JSONObject.toJSONString(resp));
}else{
// result.put("code", dataJson.getString("CODE"));
// result.put("message", dataJson.getJSONObject("MESSAGE"));
resp.put("code", dataJson.getString("CODE"));
resp.put("message", dataJson.getString("MESSAGE"));
return JSONObject.parseObject(JSONObject.toJSONString(resp));
}
}
if (StringUtils.equals("register_e_seal", query)) {
AjaxResult resp = AjaxResult.success();
Object data = result.getData();
if (!StringUtils.equals("0000", result.getStatus())) {
resp = AjaxResult.error(result.getMessage());
return JSONObject.parseObject(JSONObject.toJSONString(resp));
}
JSONObject dataJson = (JSONObject) data;
if (StringUtils.equals("0000", dataJson.getString("CODE"))) {
// result.put("code", "200");
// result.put("data", dataJson.getJSONObject("data"));
resp.put("data", dataJson.getJSONObject("DATA"));
return JSONObject.parseObject(JSONObject.toJSONString(resp));
}else{
// result.put("code", dataJson.getString("CODE"));
// result.put("message", dataJson.getJSONObject("MESSAGE"));
resp.put("code", dataJson.getString("CODE"));
resp.put("message", dataJson.getString("MESSAGE"));
return JSONObject.parseObject(JSONObject.toJSONString(resp));
}
}
if (StringUtils.equals("create_e_seal", query)) {
AjaxResult resp = AjaxResult.success();
Object data = result.getData();
if (!StringUtils.equals("0000", result.getStatus())) {
resp = AjaxResult.error(result.getMessage());
return JSONObject.parseObject(JSONObject.toJSONString(resp));
}
JSONObject dataJson = (JSONObject) data;
if (StringUtils.equals("0000", dataJson.getString("CODE"))) {
// result.put("code", "200");
// result.put("data", dataJson.getJSONObject("data"));
resp.put("data", dataJson.getJSONObject("DATA"));
return JSONObject.parseObject(JSONObject.toJSONString(resp));
}else{
// result.put("code", dataJson.getString("CODE"));
// result.put("message", dataJson.getJSONObject("MESSAGE"));
resp.put("code", dataJson.getString("CODE"));
resp.put("message", dataJson.getString("MESSAGE"));
return JSONObject.parseObject(JSONObject.toJSONString(resp));
}
}
return result;
}
@Override
public Object response(JianshuiParamErrorException result, Companyservice companyservice) {
// JSONObject myResult = new JSONObject();
// myResult.put("status", result.getErrorCode());
// myResult.put("message", result.getMsg());
// return myResult;
AjaxResult resp = AjaxResult.error(result.getErrorCode(), null);
resp.put("msg", result.getMsg());
return resp;
}
@Override
public AjaxResult callback(BillInfo billInfo, Invoice invoice, Redinfo redinfo, Companyservice companyservice, String src) {
return null;
}
}

@ -0,0 +1,716 @@
package com.jianshui.invoice.service.impl.api;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.jianshui.common.core.domain.AjaxResult;
import com.jianshui.common.core.domain.entity.Companyservice;
import com.jianshui.common.enums.ErrorCode;
import com.jianshui.common.exception.jianshui.JianshuiParamErrorException;
import com.jianshui.common.exception.jianshui.JianshuiServiceException;
import com.jianshui.common.utils.BeanToMapUtils;
import com.jianshui.common.utils.StringUtils;
import com.jianshui.common.utils.TimeUtil;
import com.jianshui.common.utils.ValidateUtils;
import com.jianshui.common.utils.uuid.IdUtils;
import com.jianshui.invoice.constant.aisino.console.AisinoConsoleConstants;
import com.jianshui.invoice.domain.*;
import com.jianshui.invoice.domain.dto.*;
import com.jianshui.invoice.domain.dto.api.aisino.console.*;
import com.jianshui.invoice.domain.vo.api.aisino.console.AisinoConsoleInvoiceAddVO;
import com.jianshui.invoice.mapper.BillInfoMapper;
import com.jianshui.invoice.mapper.InvoiceMapper;
import com.jianshui.invoice.mapper.RedinfoMapper;
import com.jianshui.invoice.mapper.SkDyjMapper;
import com.jianshui.invoice.service.IInvoiceApiService;
import com.jianshui.invoice.utils.BillInfoUtils;
import com.jianshui.invoice.utils.aisino.console.AisinoConsoleUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.*;
/**
* 金财数科
*/
@Component("jcsk_invoice")
@Slf4j
public class JcskInvoiceApiServiceImpl implements IInvoiceApiService {
@Autowired
private BillInfoMapper billInfoMapper;
@Autowired
private InvoiceMapper invoiceMapper;
@Autowired
private SkDyjMapper skDyjMapper;
@Autowired
private RedinfoMapper redinfoMapper;
/**
* 1.发票开具 SID = 1
*
* @param billInfo
* @param companyservice
* @return com.jianshui.invoice.domain.dto.HXResponse
* @author dxk
* @date 2022/6/27 16:50
*/
@Override
public HXResponse addInvoice(BillInfo billInfo, Companyservice companyservice) throws IllegalAccessException, InstantiationException {
// 预处理:处理billinfo,计算税额等
try {
billInfo = BillInfoUtils.processBillInfo(billInfo, companyservice);
} catch (JianshuiParamErrorException e) {
return new HXResponse(e.getMessage());
} catch (Exception e) {
log.error("【销项】【总部控制台发票】开票接口校验异常", e);
return new HXResponse("格式校验失败,请检查报文!");
}
// 发票类型处理 必填
Integer invoceTypeTemp = CovertInvoiceType(billInfo.getInvoiceType());
if (invoceTypeTemp == -1) {
return new HXResponse("发票类型不存在!");
}
billInfo.setInvoiceType(String.valueOf(invoceTypeTemp));
// 转换报文为总部控制台请求报文
AisinoConsoleInvoiceAddDTO aisinoConsoleInvoiceAddDTO = BeanUtil.copyProperties(billInfo, AisinoConsoleInvoiceAddDTO.class);
List<BillDetail> billDetailList = billInfo.getBillDetailList();
if (CollectionUtils.isEmpty(billDetailList)) {
return new HXResponse("发票明细不存在,请检查报文!");
}
aisinoConsoleInvoiceAddDTO.setInvoiceType(invoceTypeTemp);
//购方地址电话
String buyerAddress = billInfo.getBuyerAddress();
String buyerTelPhone = billInfo.getBuyerTelephone();
aisinoConsoleInvoiceAddDTO.setCustomerAddressTel(buyerAddress + buyerTelPhone);
//购方银行账户
String buyerBank = billInfo.getBuyerBank();
String buyerAccount = billInfo.getBuyerAccount();
aisinoConsoleInvoiceAddDTO.setCustomerBankAccountNr(buyerBank + buyerAccount);
//销方银行账户
String sellerBank = billInfo.getSellerBank();
String sellerAccount = billInfo.getSellerAccount();
if (StrUtil.isEmpty(sellerBank) || StrUtil.isEmpty(sellerAccount)) {
return new HXResponse("销方银行账户不存在!");
}
aisinoConsoleInvoiceAddDTO.setSellerBankAccountNr(sellerBank + sellerAccount);
// 销方地址电话
// 2022/12/21 中举说浪潮的地址和电话都放到 sellerAddress字段里了
/*String sellerAddress = billInfo.getSellerAddress();
String sellerTelephone = billInfo.getSellerTelephone();
if (StrUtil.isEmpty(sellerAddress) || StrUtil.isEmpty(sellerTelephone)) {
return new HXResponse("销方地址电话不存在!");
}
aisinoConsoleInvoiceAddDTO.setSellerAddressTel(sellerAddress + sellerTelephone);*/
String sellerAddress = billInfo.getSellerAddress();
if (StrUtil.isEmpty(sellerAddress)) {
return new HXResponse("销方地址电话不存在!");
}
aisinoConsoleInvoiceAddDTO.setSellerAddressTel(sellerAddress);
//清单标志
String qdbz = billInfo.getQdbz();
if (StrUtil.isEmpty(qdbz)) {
return new HXResponse("清单标志不存在!");
}
boolean qdbzTemp = qdbz.equals("1") ? true : false;
aisinoConsoleInvoiceAddDTO.setListed(qdbzTemp);
// 销售单号 非必填
//aisinoConsoleInvoiceAddDTO.setDocumentNr("");
// 开票校验标识 问了下主任这里默认塞 0 标识开票
aisinoConsoleInvoiceAddDTO.setCheckEWM(0);
//税额
BigDecimal tax = billInfo.getTax();
aisinoConsoleInvoiceAddDTO.setTax(Convert.toDouble(tax));
//数量 非必填
//aisinoConsoleInvoiceAddDTO.setQuantity(0.0D);
//专票必填
if (invoceTypeTemp == 0) {
if (StrUtil.isEmpty(aisinoConsoleInvoiceAddDTO.getCustomerTaxNr())) {
return new HXResponse("购方税号不存在,专票!");
}
if (StrUtil.isEmpty(aisinoConsoleInvoiceAddDTO.getCustomerAddressTel())) {
return new HXResponse("购方地址电话不存在,专票!");
}
if (StrUtil.isEmpty(aisinoConsoleInvoiceAddDTO.getCustomerBankAccountNr())) {
return new HXResponse("购方银行账户不存在,专票!");
}
}
//处理备注
String kpType = billInfo.getKptype() == null ? "":billInfo.getKptype() ;
String redInvoiceCode = billInfo.getRedInvoiceInfoCode() == null ? "":billInfo.getRedInvoiceInfoCode();
if("2".equals(kpType) && invoceTypeTemp == 0){
//专票:红字信息表编号 开具红字发票:备注中注明“开具红字增值税专用发票信息表编号 XXXXXXXXXXXXXXXX”
aisinoConsoleInvoiceAddDTO.setMemo("开具红字增值税专用发票信息表编号"+redInvoiceCode);
}else if("2".equals(kpType) && invoceTypeTemp == 2){
//普票:开具负数发票(普通发票负数发票):备注中注明“对应正数发票代码 XXXXXXXXXX 号 码 YYYYYYYY”字样,其中“X”为发票左上角 10 或是 12 位代码数字,“Y”为发票右上角 8位号码数字
aisinoConsoleInvoiceAddDTO.setMemo("对应正数发票代码"+billInfo.getOriginFpdm()+"号码"+billInfo.getOriginFphm());
}
//明细处理前条件校验
ValidateUtils.validate(aisinoConsoleInvoiceAddDTO, companyservice, null);
//发票明细处理
List<AisinoConsoleInvoiceAddDetailDTO> invoiceItems = new ArrayList<>();
List<Map<String,Object>> listMap = new ArrayList<>();
for (BillDetail billDetail : billDetailList) {
AisinoConsoleInvoiceAddDetailDTO addDetailDTO = BeanUtil.copyProperties(billDetail, AisinoConsoleInvoiceAddDetailDTO.class);
//通过含税标志,区分含税单价不含税单价
Integer hsbz = billDetail.getHsbz();
if (hsbz == null) {
return new HXResponse("含税标志不存在!");
}
addDetailDTO.setIncludeTax(hsbz == 1 ? true : false);
//税率
addDetailDTO.setTaxRate(Convert.toDouble(billDetail.getTaxrate()));
//金额
Double je = 0D;
if (hsbz == 1) {
je = Convert.toDouble(billDetail.getTaxamt());
} else if (hsbz == 0) {
je = Convert.toDouble(billDetail.getTaxfreeamt());
} else {
return new HXResponse("金额不存在!");
}
addDetailDTO.setValue(je);
//单价
addDetailDTO.setPrice(Convert.toDouble(billDetail.getPrice()));
//是否享受优惠政策
Integer yhzcbs = billDetail.getYhzcbs();
if (yhzcbs == null) {
return new HXResponse("优惠政策标识不存在!");
}
addDetailDTO.setTaxPre(String.valueOf(yhzcbs));
//享受优惠政策内容 非必填
//addDetailDTO.setTaxPreCon("");
//企业自编码 非必填
//addDetailDTO.setCropGoodsNo("");
ValidateUtils.validate(addDetailDTO, companyservice, null);
invoiceItems.add(addDetailDTO);
Map<String,Object> mapDetail = BeanToMapUtils.fastJsonBean2Map(addDetailDTO);
listMap.add(mapDetail);
}
aisinoConsoleInvoiceAddDTO.setInvoiceItems(invoiceItems);
// 发起请求
AjaxResult ajaxResult = null;
try {
//hutool的beancopy别名会与JSONUTIl冲突
Map<String,Object> map = BeanToMapUtils.fastJsonBean2Map(aisinoConsoleInvoiceAddDTO);
map.put("invoiceItems",listMap);
ajaxResult = AisinoConsoleUtil.sendRequest(AisinoConsoleConstants.INVOICE_ADD, JSONUtil.parse(map), companyservice);
} catch (Exception e) {
log.error("【销项发票】【总部控制台接口】【发票开具】发票请求异常,请求报文{},销方信息{}", JSONUtil.parse(aisinoConsoleInvoiceAddDTO).toString(), JSONObject.toJSONString(companyservice));
e.printStackTrace();
throw new JianshuiServiceException("系统异常!");
}
log.info("【销项发票】【总部控制台发票】发票开具请求拉取结果{}", ajaxResult.toString());
//返回报文解析
if (ajaxResult.isError()) {
throw new JianshuiServiceException(ajaxResult.getMsg());
}
cn.hutool.json.JSONObject resultJSON = JSONUtil.parseObj(ajaxResult.get("data"));
String retcode = resultJSON.get("retcode") != null ? resultJSON.get("retcode").toString() : "";
String retmsg = resultJSON.get("retmsg") != null ? resultJSON.get("retmsg").toString() : "";
if ("4011".equals(retcode)) {
//回写发票代码、发票号码信息
if(StrUtil.isEmpty(retmsg)){
return new HXResponse(retcode);
}
AisinoConsoleInvoiceAddVO aisinoConsoleInvoiceAddVO = BeanUtil.copyProperties(resultJSON, AisinoConsoleInvoiceAddVO.class);
if(StrUtil.isEmpty(aisinoConsoleInvoiceAddVO.getInfoNumber())){
throw new JianshuiServiceException("开具的发票号码不存在!");
}
//更新发票状态
billInfo.setState(2);
billInfoMapper.updateBillInfo(billInfo);
//插入invoice
Invoice invoice = BeanUtil.copyProperties(billInfo,Invoice.class);
List<InvoiceDetail> invoiceDetailList = BeanUtil.copyToList(billInfo.getBillDetailList(),InvoiceDetail.class);
invoice.setInvoiceDetailList(invoiceDetailList);
//发票代码
invoice.setFpdm(aisinoConsoleInvoiceAddVO.getInfoTypeCode());
//发票号码
invoice.setFphm(aisinoConsoleInvoiceAddVO.getInfoNumber());
//上一张发票代码
invoice.setOriginFpdm(aisinoConsoleInvoiceAddVO.getHisInfoTypeCode());
//上一张发票号码
invoice.setOriginFphm(aisinoConsoleInvoiceAddVO.getHisInfoNumber());
//上一张发票种类
String hisInvoceTypeTemp = CovertInvoiceTypeReverse(aisinoConsoleInvoiceAddVO.getHisInfoKind());
invoice.setInvoiceType(hisInvoceTypeTemp);
invoice.setBillInfoId(billInfo.getId());
long id = 0L;
QueryWrapper<Invoice> invoiceQueryWrapper = new QueryWrapper<>();
invoiceQueryWrapper.eq("fpdm",invoice.getFpdm()).eq("fphm",invoice.getFphm());
List<Invoice> invoices = invoiceMapper.selectList(invoiceQueryWrapper);
if(CollectionUtils.isEmpty(invoices)){
invoiceMapper.insertInvoice(invoice);
invoices = invoiceMapper.selectList(invoiceQueryWrapper);
id = invoices.get(0).getId();
}else{
Invoice invoiceT = invoices.get(0);
invoiceT = BeanUtil.copyProperties(invoice,Invoice.class);
invoiceMapper.updateInvoice(invoiceT);
id = invoiceT.getId();
}
invoiceDetailList.forEach(i -> i.setInvoiceId(invoice.getId()));
invoiceMapper.batchInvoiceDetail(invoiceDetailList);
HXResponse response = new HXResponse("0000", "同步成功");
response.put("fpqqlsh", billInfo.getSystemOrderno());
return response;
} else {
return new HXResponse(retmsg);
}
}
/**
* 发票打印
* @author dxk
* @date 2022/6/29 13:48
* @param invoice
* @param companyservice
* @return com.jianshui.common.core.domain.AjaxResult
*/
@Override
public AjaxResult printInvoice(Invoice invoice, Companyservice companyservice) {
return null;
}
/**
* 发票作废
* @author dxk
* @date 2022/6/30 9:43
* @param invoice
* @param companyservice
* @return com.jianshui.invoice.domain.dto.HXResponse
*/
@Override
public HXResponse deprecateInvoice(JSONObject invoice, Companyservice companyservice) {
return null;
}
@Override
public AjaxResult reInvoice(BillInfo billInfo, Companyservice companyservice) {
return null;
}
/**
* 单个发票查询
* @param billInfo
* @param companyservice
* @return
*/
@Override
public HXResponse queryInvoice(QueryBillInfoDTO billInfo, Companyservice companyservice) {return null;}
/**
* 发票批量查询
* @param billInfo
* @param byWhat
* @param companyservice
* @return
*/
@Override
public HXResponse batchQueryInvoices(BillInfo billInfo, String byWhat, Companyservice companyservice) {
return null;
}
@Override
public HXResponse scopeQueryInvoices(JSONObject queryJson, Companyservice companyservice) {
return null;
}
/** 红字信息表上传*/
@Override
public HXResponse uploadRedInfo(Redinfo redinfo, Companyservice companyservice) {
// 前置处理
redinfo.setCompanyId(companyservice.getCompanyid());
redinfo.setSystemOrderno(IdUtils.randomSystemOrderno());
if (StringUtils.isEmpty(redinfo.getOutTradeOrderno())) {
// 把 outTradeOrderno作为用户的申请单号
throw new JianshuiParamErrorException(ErrorCode.EMPTY_REDINFO_NO, companyservice, "invoice");
}
redinfo.setOutTradeOrderno(redinfo.getOutTradeOrderno());
redinfo.setFpqqlsh(redinfo.getSystemOrderno());
redinfo.setRedInfoStatus("0");
redinfo.setSellerName(companyservice.getSellername());
redinfo.setSellerTaxnum(companyservice.getSellertax());
redinfo.setBillInputTime(TimeUtil.dateFormat(new Date(), "yyyyMMddHHmmss"));
List<Redinfodetail> redinfodetailList = redinfo.getRedinfodetailList();
BigDecimal taxfreeamt = new BigDecimal(0); // 不含税金额
BigDecimal tax = new BigDecimal(0); // 税额
for (Redinfodetail detail : redinfodetailList) {
taxfreeamt = taxfreeamt.add(detail.getTaxfreeamt());
tax = tax.add(detail.getTax());
}
redinfo.setTax(tax);
redinfo.setTaxfreeamt(taxfreeamt);
redinfo.setTaxamt(tax.add(taxfreeamt));
redinfoMapper.insertRedinfo(redinfo);
int index = 0;
String spbm = "";
for (Redinfodetail detail : redinfodetailList) {
detail.setBillno(redinfo.getRedInfoNo());
detail.setRedinfoId(redinfo.getId());
detail.setIndex(++index);
detail.setBillno(redinfo.getRedInfoNo());
taxfreeamt = taxfreeamt.add(detail.getTaxfreeamt());
tax = tax.add(detail.getTax());
// 商品编码
spbm = detail.getSpbm();
}
// TODO: 2023/3/9 设备号是 jspbh 并非billNO? 申请方税号reqnsrsbh
//
redinfo.setJspbh("661024643068230218103524".substring(0,12));
redinfo.setReqnsrsbh("9113093067851155XY");
redinfo.setFjh("123");
redinfo.setMultTaxRate("0");
redinfo.setBillInputTime("2022-11-11");
redinfo.setBmbbh("2323232");
redinfo.setTaxrate(new BigDecimal("0.03"));
//
redinfoMapper.batchRedinfodetail(redinfodetailList);
// 参数校验及参数处理
AisinoConsoleInvoiceRedUploadDTO redUploadDTO = BeanUtil.copyProperties(redinfo,AisinoConsoleInvoiceRedUploadDTO.class);
// 填开日期
redUploadDTO.setDate(redinfo.getBillInputTime());
// 信息表类型
redUploadDTO.setBillType("0");
// TODO-dxk: 2023/2/27 含税、不含税金额 含税标志,这里需要确定
// 合计金额计算
redUploadDTO.setAmount(String.valueOf(taxfreeamt));
// 含税税率标识
redUploadDTO.setSLBZ("0");
// 税种类别
redUploadDTO.setSzlb("1");
ValidateUtils.validate(redUploadDTO);
if(redinfo.getRedinfodetailList() == null || redinfo.getRedinfodetailList().size() == 0){
return new HXResponse("格式校验失败,请上传明细信息!");
}
String paramChild = "";
List<AisinoConsoleInvoiceRedUploadChildDTO> redUploadChildDTO = BeanUtil.copyToList(redinfo.getRedinfodetailList(),AisinoConsoleInvoiceRedUploadChildDTO.class);
for (AisinoConsoleInvoiceRedUploadChildDTO childDTO : redUploadChildDTO) {
// TODO-dxk: 2023/2/27 含税、不含税金额
childDTO.setHS_BZ(childDTO.getHS_BZ().equals("false")? "N":"Y");
paramChild = "<GoodsMx>" + JSONUtil.toXmlStr(JSONUtil.parse(childDTO)) + " </GoodsMx>";
ValidateUtils.validate(childDTO);
}
// 组装xml报文
String param = JSONUtil.toXmlStr(JSONUtil.parse(redUploadDTO));
// param = "<?xml version=\"1.0\" encoding=\"GBK\"?>\n" +
param = "" +
"<FPXT>\n" +
" <INPUT>\n" +
" <RedInvReqBill>" + param;
param = param + "<RedInvReqBillMx>";
param = param + paramChild;
param = param + " </RedInvReqBillMx>\n" +
" </RedInvReqBill>\n" +
" </INPUT>\n" +
"</FPXT>";
//发起请求
AjaxResult ajaxResult = null;
try{
ajaxResult = AisinoConsoleUtil.sendRequest(AisinoConsoleConstants.RED_UPLOAD, param, companyservice);
}catch (Exception e){
log.error("【销项发票】【总部控制台接口】【发票作废】发票请求异常,请求报文{},销方信息{}","", JSONObject.toJSONString(companyservice));
e.printStackTrace();
throw new JianshuiServiceException("系统异常!");
}
//返回报文解析
if (ajaxResult.isError()) {
throw new JianshuiServiceException(ajaxResult.getMsg());
}
// todo-k: 返回报文解析这里还带看下具体的返回形式
cn.hutool.json.JSONObject resultJSON = JSONUtil.parseObj(ajaxResult.get("data"));
String retcode = resultJSON.get("retcode") != null ? resultJSON.get("retcode").toString() : "";
String retmsg = resultJSON.get("retmsg") != null ? resultJSON.get("retmsg").toString() : "";
if (!StringUtils.equals("0000", retcode)) {
redinfo.setRedInfoStatus("2");
redinfo.setRedInfoMessage(retmsg);
redinfoMapper.updateRedinfo(redinfo);
return new HXResponse(retmsg);
}
// TODO-dxk: 2023/2/27 看下 RedInfoStatus 0 1 2代表什么
redinfo.setRedInfoStatus("1");
redinfo.setRedInfoMessage(retmsg);
redinfoMapper.updateRedinfo(redinfo);
return new HXResponse(retmsg);
}
@Override
public AjaxResult queryRedInfo(Redinfo redinfo, Companyservice companyservice) {
return null;
}
/** 红字信息表下载 */
@Override
public HXResponse downloadRedInfo(DownloadRedInfoDTO downloadRedInfoDTO, Companyservice companyservice) {
// 查找之前的红票
Redinfo redinfo = new Redinfo();
redinfo.setRedInfoNo(downloadRedInfoDTO.getBillInfoNo());
redinfo.setCompanyId(companyservice.getCompanyid());
QueryWrapper<Redinfo> queryWrapper = new QueryWrapper<>();
if (StringUtils.isNotEmpty(downloadRedInfoDTO.getInvoiceLine())) {
queryWrapper.eq("invoice_type", downloadRedInfoDTO.getInvoiceLine());
}
if (StringUtils.isNotEmpty(downloadRedInfoDTO.getBuyerTaxNo())) {
queryWrapper.eq("buyer_taxnum", downloadRedInfoDTO.getBuyerTaxNo());
}
if (StringUtils.isNotEmpty(downloadRedInfoDTO.getExtensionNumber())) {
queryWrapper.eq("fjh", downloadRedInfoDTO.getExtensionNumber());
}
if (StringUtils.isNotEmpty(downloadRedInfoDTO.getTerminalNumber())) {
queryWrapper.eq("terminal_number", downloadRedInfoDTO.getTerminalNumber());
}
if (StringUtils.isNotEmpty(downloadRedInfoDTO.getBillTimeBegin())) {
queryWrapper.ge("bill_input_time", downloadRedInfoDTO.getBillTimeBegin());
}
if (StringUtils.isNotEmpty(downloadRedInfoDTO.getBillTimeEnd())) {
queryWrapper.le("bill_input_time", downloadRedInfoDTO.getBillTimeEnd());
}
if (StringUtils.isNotEmpty(downloadRedInfoDTO.getBillNo())) {
queryWrapper.le("out_trade_orderno", downloadRedInfoDTO.getBillNo());
}
queryWrapper.orderByDesc("id");
queryWrapper.last(" limit 1 ");
Redinfo redInfoResult = redinfoMapper.selectOne(queryWrapper);
if (redInfoResult == null) {
HXResponse response = new HXResponse("9999", "未查到指定红字信息");
return response;
}
// 组装报文
AisinoConsoleInvoiceRedDownloadDTO downloadDTO = BeanUtil.copyProperties(redInfoResult,AisinoConsoleInvoiceRedDownloadDTO.class);
downloadDTO.setYQZT("N");
downloadDTO.setXXBFW("0");
downloadDTO.setPAGENO("1");
downloadDTO.setPAGESIZE("1000");
String param = JSONUtil.toXmlStr(JSONUtil.parse(downloadDTO));
param = "<?xml version=\"1.0\" encoding=\"GBK\"?>\n" +
"<FPXT>\n" +
" <INPUT>\n" + param + "</INPUT>\n" +
"</FPXT>";
//发起请求
AjaxResult ajaxResult = null;
try{
ajaxResult = AisinoConsoleUtil.sendRequest(AisinoConsoleConstants.RED_DOWLOAD, param, companyservice);
}catch (Exception e){
log.error("【销项发票】【总部控制台接口】【发票作废】发票请求异常,请求报文{},销方信息{}","", JSONObject.toJSONString(companyservice));
e.printStackTrace();
throw new JianshuiServiceException("系统异常!");
}
//返回报文解析
if (ajaxResult.isError()) {
throw new JianshuiServiceException(ajaxResult.getMsg());
}
cn.hutool.json.JSONObject resultJSON = JSONUtil.parseObj(ajaxResult.get("data"));
String retcode = resultJSON.get("retcode") != null ? resultJSON.get("retcode").toString() : "";
String retmsg = resultJSON.get("retmsg") != null ? resultJSON.get("retmsg").toString() : "";
// todo-k: 下载的返回报文需要单独处理,更新信息表状态?
// todo-k: 返回的格式看看怎么处理一把,VO都已经创建
if (!StringUtils.equals("0000", retcode)) {
return new HXResponse(retmsg);
}
return null;
}
@Override
public HXResponse deprecateQueryInvoice(DeprecateQueryInvoiceDTO invoice, Companyservice companyservice) {
return null;
}
/**
* 打印机查询
* @param queryPrinterDTO
* @param companyservice
* @return
*/
@Override
public HXResponse queryPrinter(QueryPrinterDTO queryPrinterDTO, Companyservice companyservice) {
return null;
}
@Override
public HXResponse pushData(BillInfo billInfo, Companyservice companyservice) {
return null;
}
/**
* 发票打印
* @param printDTO
* @param companyservice
* @return
*/
@Override
public HXResponse batchPrint(PrintDTO printDTO, Companyservice companyservice) {
return null;
}
@Override
public AjaxResult syncStockInfo(Companyservice companyservice) {
return null;
}
@Override
public HXResponse signInvoice(SignESealDTO signESealDTO, Companyservice companyservice) {
return null;
}
@Override
public HXResponse createESeal(CreateESealDTO createESealDTO, Companyservice companyservice) {
return null;
}
@Override
public HXResponse registerESeal(RegisterESealDTO createESealDTO, Companyservice companyservice) {
return null;
}
@Override
public AjaxResult SummaryReport(SummaryReportQueryDTO summaryReportQueryDTO, Companyservice companyservice) {
return null;
}
@Override
public Object callback(HttpServletRequest request) {
return null;
}
/**
* 简税转换总部控制台发票类型
*
* @param invoiceType
* @return java.lang.Integer
* @author dxk
* @date 2022/6/28 20:17
*/
public static Integer CovertInvoiceType(String invoiceType) {
/**
* 发票种类 invoice_type p电子增值税普通发票 c增值税普通发票 s 增值税专用发票 e 收购发票 f 收购发票 r增值税普通发票
*/
if (StrUtil.isEmpty(invoiceType)) {
return -1;
}
if ("p".equals(invoiceType) || "c".equals(invoiceType) || "e".equals(invoiceType) || "f".equals(invoiceType) || "r".equals(invoiceType)) {
return 2;
} else if ("s".equals(invoiceType)) {
return 0;
}
return -1;
}
/**
* 总部控制台转简税发票类型
* @author dxk
* @date 2022/6/29 17:12
* @param invoiceType
* @return java.lang.String
*/
public static String CovertInvoiceTypeReverse(String invoiceType){
if(invoiceType.equals("2")){
return "p";
}else if(invoiceType.equals("0")){
return "s";
}
return "";
}
@Override
public Object addCallback(HttpServletRequest request) {
return null;
}
@Override
public Object decryptCallback(HttpServletRequest request) {
return null;
}
}