فهرست منبع

Merge remote-tracking branch 'origin/yitoa_invoice' into yitoa_invoice

DINGYL 2 سال پیش
والد
کامیت
6d801448b7
23فایلهای تغییر یافته به همراه983 افزوده شده و 103 حذف شده
  1. 54 0
      src/main/java/com/uas/eis/core/enums/ElecInVoiceSpecificFactor.java
  2. 81 0
      src/main/java/com/uas/eis/core/enums/ElecInVoicekind.java
  3. 9 0
      src/main/java/com/uas/eis/dao/BaseNuoNuoQResp.java
  4. 46 19
      src/main/java/com/uas/eis/dto/FindOrderRelationInvoiceDTO.java
  5. 13 0
      src/main/java/com/uas/eis/dto/QSqlDTO.java
  6. 33 0
      src/main/java/com/uas/eis/dto/QueryInvoiceRedConfirmDTO.java
  7. 21 0
      src/main/java/com/uas/eis/dto/QueryInvoiceRedConfirmDetDTO.java
  8. 16 0
      src/main/java/com/uas/eis/dto/QueryInvoiceRedConfirmReq.java
  9. 9 0
      src/main/java/com/uas/eis/dto/QueryInvoiceRedConfirmResp.java
  10. 12 0
      src/main/java/com/uas/eis/dto/QueryInvoiceRedConfirmRespDTO.java
  11. 93 0
      src/main/java/com/uas/eis/dto/QueryInvoiceResultDTO.java
  12. 12 0
      src/main/java/com/uas/eis/dto/QueryInvoiceResultReq.java
  13. 11 0
      src/main/java/com/uas/eis/dto/QueryInvoiceResultResp.java
  14. 3 3
      src/main/java/com/uas/eis/dto/RelateRedInvoiceDTO.java
  15. 2 0
      src/main/java/com/uas/eis/service/CommonService.java
  16. 4 2
      src/main/java/com/uas/eis/service/ERPService.java
  17. 10 1
      src/main/java/com/uas/eis/service/Impl/CommonServiceImpl.java
  18. 225 54
      src/main/java/com/uas/eis/service/Impl/ERPServiceImpl.java
  19. 85 0
      src/main/java/com/uas/eis/service/Impl/NuoNuoSDKServiceImpl.java
  20. 17 0
      src/main/java/com/uas/eis/service/NuoNuoSDKService.java
  21. 188 18
      src/main/java/com/uas/eis/task/ElecInvoiceTask.java
  22. 1 1
      src/main/java/com/uas/eis/task/InvoiceOrderTask.java
  23. 38 5
      src/test/java/com/uas/eis/UasEisApplicationTests.java

+ 54 - 0
src/main/java/com/uas/eis/core/enums/ElecInVoiceSpecificFactor.java

@@ -0,0 +1,54 @@
+package com.uas.eis.core.enums;
+
+/**
+ * @author: WUYX
+ * @date: 2023/08/02
+ * @desc: 发票特定要素
+ *  0-普通 1-成品油发票 3-建筑服务 4-货物运输服务 6-不动产经营租赁服务 9-旅客运输服务 16-农产品收购 31-建安发票 32-房地产销售发票 33-二手车发票反向开具 34-电子烟 35-矿产品
+ */
+public enum ElecInVoiceSpecificFactor {
+    PT(0,"普通"),
+    CPYFP(1,"成品油发票"),
+    JZFW(3,"建筑服务"),
+    HWYXFU(4,"货物运输服务"),
+    BDCJYZLFW(6,"不动产经营租赁服务"),
+    LKYSFW(9,"旅客运输服务"),
+    NCPSG(16,"农产品收购"),
+    JAFP(31,"建安发票"),
+    FDCXSFP(32,"房地产销售发票"),
+    ESCFPFXKJ(33,"二手车发票反向开具"),
+    DZY(34,"电子烟"),
+    KCP(35,"矿产品")
+    ;
+    private int sid;
+    private String description;
+
+    private ElecInVoiceSpecificFactor(int sid,String description){
+        this.sid = sid;
+        this.description = description;
+    }
+
+    public int getSid() {
+        return sid;
+    }
+
+    public void setSid(int sid) {
+        this.sid = sid;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+    public static String getDescription(int sid_) {
+        for (ElecInVoiceSpecificFactor sf : values()) {
+            if (sf.getSid() == sid_) {
+                return sf.getDescription();
+            }
+        }
+        return String.valueOf(sid_);
+    }
+}

+ 81 - 0
src/main/java/com/uas/eis/core/enums/ElecInVoicekind.java

@@ -0,0 +1,81 @@
+package com.uas.eis.core.enums;
+
+/**
+ * @author: WUYX
+ * @date: 2023/08/02
+ * @desc: 发票特定要素
+ *  发票种类
+ *  合并冲销时为空
+ *  p:普通发票(电票)
+ *  c:普通发票(纸票)
+ *  s:专用发票(纸票)
+ *  b:专用发票(电子)
+ *  e:收购发票(电票)
+ *  f:收购发票(纸质)
+ *  r:普通发票(卷式)
+ *  bs:数电专票(电子)
+ *  pc:数电普票(电子)
+ *  es:数电专票(纸质)
+ *  ec:数电普票(纸质)
+ * 发票种类,
+ * 增值税电子普通发票、增值税普通发票、专用发票(电子)、增值税专用发票、收购发票(电子)、收购发票(纸质)、增值税普通发票(卷式)、机动车销售统一发票、
+ * 二手车销售统一发票、电子发票(增值税专用发票)、电子发票(普通发票)、全电纸质发票(增值税专用发票)、全电纸质发票(普通发票);
+ * 备注:电子发票(增值税专用发票)即 数电专票(电子),电子发票(普通发票)即 数电普票(电子)
+ *
+ */
+public enum ElecInVoicekind {
+    P("p","普通发票(电票)","增值税普通发票"),
+    C("c","普通发票(纸票)","增值税电子普通发票"),
+    S("s","专用发票(纸票)","增值税专用发票"),
+    B("b","专用发票(电子)","专用发票(电子)"),
+    E("e","收购发票(电票)","收购发票(电子)"),
+    F("f","收购发票(纸质)","收购发票(纸质)"),
+    R("r","普通发票(卷式)","增值税普通发票(卷式)"),
+    BS("bs","数电专票(电子)","电子发票(增值税专用发票)"),
+    PC("pc","数电普票(电子)","电子发票(普通发票)"),
+    ES("es","数电专票(纸质)","全电纸质发票(增值税专用发票)"),
+    EC("ec","数电普票(纸质)","全电纸质发票(普通发票)")
+    ;
+    private String line;//EI_INVOICELINE
+    private String name;
+    private String kind;//EI_INVOICEKIND
+
+    private ElecInVoicekind(String line,String name, String kind){
+        this.line = line;
+        this.name = name;
+        this.kind = kind;
+    }
+
+    public String getLine() {
+        return line;
+    }
+
+    public void setLine(String line) {
+        this.line = line;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getKind() {
+        return kind;
+    }
+
+    public void setKind(String kind) {
+        this.kind = kind;
+    }
+
+    public static String getKind(String line) {
+        for (ElecInVoicekind sf : values()) {
+            if (sf.getLine() == line) {
+                return sf.getKind();
+            }
+        }
+        return String.valueOf(line);
+    }
+}

+ 9 - 0
src/main/java/com/uas/eis/dao/BaseNuoNuoQResp.java

@@ -0,0 +1,9 @@
+package com.uas.eis.dao;
+
+import lombok.Data;
+
+@Data
+public class BaseNuoNuoQResp {
+    private String code;
+    private String describe;
+}

+ 46 - 19
src/main/java/com/uas/eis/dto/FindOrderRelationInvoiceDTO.java

@@ -1,10 +1,14 @@
 package com.uas.eis.dto;
 package com.uas.eis.dto;
 
 
+import com.uas.eis.utils.NumberUtil;
+import com.uas.eis.utils.StringUtil;
 import lombok.Data;
 import lombok.Data;
+
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 
 
 @Data
 @Data
-public class FindOrderRelationInvoiceDTO {
+public class FindOrderRelationInvoiceDTO extends QSqlDTO{
     private String sid;//发票流水号,返回合并冲销的开票单为空
     private String sid;//发票流水号,返回合并冲销的开票单为空
     private String orderNo;//开票单号
     private String orderNo;//开票单号
     private String createtime;//开票单的创建时间
     private String createtime;//开票单的创建时间
@@ -44,17 +48,18 @@ public class FindOrderRelationInvoiceDTO {
     private List<OrderDetailCallBackVOSDTO> orderDetailCallBackVOS;//发票来源的订单明细list
     private List<OrderDetailCallBackVOSDTO> orderDetailCallBackVOS;//发票来源的订单明细list
     private List<RelateRedInvoiceDTO> relateRedInvoiceList;//发票来源的订单明细list
     private List<RelateRedInvoiceDTO> relateRedInvoiceList;//发票来源的订单明细list
 
 
-    public String toMergeSql(int ioid,int detno){
+    public List<String> toMergeSql(int ioid,int detno){
+        List<String> sqls = new ArrayList<>();
         String sql = "merge into (" +
         String sql = "merge into (" +
                 "    select ei_id,ei_indate,ei_updatedate,ei_detno,ei_ioid,ei_iocode,ei_biid,ei_bicode " +
                 "    select ei_id,ei_indate,ei_updatedate,ei_detno,ei_ioid,ei_iocode,ei_biid,ei_bicode " +
-                "        ,ei_sid,ei_orderno,ei_createtime,ei_invoicetype,ei_invoiceline,ei_specificfactor,ei_invoicestate,ei_exceptionmessage,ei_invoicecode,ei_invoicenumber " +
+                "        ,ei_refno,ei_sid,ei_orderno,ei_createtime,ei_invoicetype,ei_invoiceline,ei_specificfactor,ei_invoicestate,ei_exceptionmessage,ei_invoicecode,ei_invoicenumber " +
                 "        ,ei_allelectronicinvoicenumber,ei_oldinvoicecode,ei_oldinvoicenumber,ei_oldallelectronicinvoicenu,ei_invoicetime,ei_invalidtime,ei_rushredstate,ei_pdfurl,ei_ofdurl " +
                 "        ,ei_allelectronicinvoicenumber,ei_oldinvoicecode,ei_oldinvoicenumber,ei_oldallelectronicinvoicenu,ei_invoicetime,ei_invalidtime,ei_rushredstate,ei_pdfurl,ei_ofdurl " +
                 "        ,ei_imageurl,ei_calcexcludingtaxamount,ei_calctaxamount,ei_caleorderamount,ei_sellertaxno,ei_sellername,ei_taxno,ei_buyername,ei_remark,ei_clerker " +
                 "        ,ei_imageurl,ei_calcexcludingtaxamount,ei_calctaxamount,ei_caleorderamount,ei_sellertaxno,ei_sellername,ei_taxno,ei_buyername,ei_remark,ei_clerker " +
-                "        ,ei_payee,ei_checker,ei_bfield1,ei_bfield2,ei_bfield3 " +
+                "        ,ei_payee,ei_checker,ei_bfield1,ei_bfield2,ei_bfield3,ei_pdfattach " +
                 "    from elecinvoice where ei_ioid = " +ioid+
                 "    from elecinvoice where ei_ioid = " +ioid+
                 " ) a USING ( " +
                 " ) a USING ( " +
                 "    select io_id,io_code,io_biid,io_bicode, "+detno+" eiDetno " +
                 "    select io_id,io_code,io_biid,io_bicode, "+detno+" eiDetno " +
-                "        ,"+stringField(getSid())+" eiSid,"+stringField(getOrderNo())+" eiOrderno,"+timeField(getCreatetime())+" eiCreatetime,"+numberField(getInvoiceType())+" eiInvoicetype,"+stringField(getInvoiceLine())+" eiinvoiceline,"+stringField(getSpecificFactor())+" eiSpecificfactor,"+numberField(getInvoiceState())+" eiInvoicestate" +
+                "        ,"+getRefno()+" eiRefno,"+stringField(getSid())+" eiSid,"+stringField(getOrderNo())+" eiOrderno,"+timeField(getCreatetime())+" eiCreatetime,"+numberField(getInvoiceType())+" eiInvoicetype,"+stringField(getInvoiceLine())+" eiinvoiceline,"+stringField(getSpecificFactor())+" eiSpecificfactor,"+numberField(getInvoiceState())+" eiInvoicestate" +
                 "        ,"+stringField(getExceptionMessage())+" eiExceptionmessage,"+stringField(getInvoiceCode())+" eiInvoicecode,"+stringField(getInvoiceNumber())+" eiInvoicenumber " +
                 "        ,"+stringField(getExceptionMessage())+" eiExceptionmessage,"+stringField(getInvoiceCode())+" eiInvoicecode,"+stringField(getInvoiceNumber())+" eiInvoicenumber " +
                 "        ,"+stringField(getAllElectronicInvoiceNumber())+" eiAllelectronicinvoicenumber,"+stringField(getOldInvoiceCode())+" eiOldinvoicecode,"+stringField(getOldInvoiceNumber())+" eiOldinvoicenumber,"+stringField(getOldAllElectronicInvoiceNu())+" eiOldallelectronicinvoicenu " +
                 "        ,"+stringField(getAllElectronicInvoiceNumber())+" eiAllelectronicinvoicenumber,"+stringField(getOldInvoiceCode())+" eiOldinvoicecode,"+stringField(getOldInvoiceNumber())+" eiOldinvoicenumber,"+stringField(getOldAllElectronicInvoiceNu())+" eiOldallelectronicinvoicenu " +
                 "        ,"+timeField(getInvoiceTime())+" eiInvoicetime,"+timeField(getInvalidTime())+" eiInvalidtime,"+(getRushRedState())+" eiRushredstate " +
                 "        ,"+timeField(getInvoiceTime())+" eiInvoicetime,"+timeField(getInvalidTime())+" eiInvalidtime,"+(getRushRedState())+" eiRushredstate " +
@@ -65,33 +70,55 @@ public class FindOrderRelationInvoiceDTO {
                 "    from dual,(select io_id,io_code,io_biid,io_bicode from invoiceorder where io_id = "+ioid+") " +
                 "    from dual,(select io_id,io_code,io_biid,io_bicode from invoiceorder where io_id = "+ioid+") " +
                 ") b on (nvl(a.ei_orderno,' ') = b.eiorderno) " +
                 ") b on (nvl(a.ei_orderno,' ') = b.eiorderno) " +
                 "when matched then update set ei_updatedate=sysdate " +
                 "when matched then update set ei_updatedate=sysdate " +
-                "    ,ei_detno = eidetno,ei_sid = eisid,ei_createtime = eicreatetime,ei_invoicetype = eiinvoicetype,ei_invoiceline = eiinvoiceline,ei_specificfactor = eispecificfactor " +
+                "    ,ei_detno = eidetno,ei_refno = eiRefno,ei_sid = eisid,ei_createtime = eicreatetime,ei_invoicetype = eiinvoicetype,ei_invoiceline = eiinvoiceline,ei_specificfactor = eispecificfactor " +
                 "    ,ei_invoicestate = eiinvoicestate,ei_exceptionmessage = eiexceptionmessage,ei_invoicecode = eiinvoicecode,ei_invoicenumber = eiinvoicenumber " +
                 "    ,ei_invoicestate = eiinvoicestate,ei_exceptionmessage = eiexceptionmessage,ei_invoicecode = eiinvoicecode,ei_invoicenumber = eiinvoicenumber " +
                 "    ,ei_allelectronicinvoicenumber = eiallelectronicinvoicenumber,ei_oldinvoicecode = eioldinvoicecode,ei_oldinvoicenumber = eioldinvoicenumber,ei_oldallelectronicinvoicenu = eioldallelectronicinvoicenu " +
                 "    ,ei_allelectronicinvoicenumber = eiallelectronicinvoicenumber,ei_oldinvoicecode = eioldinvoicecode,ei_oldinvoicenumber = eioldinvoicenumber,ei_oldallelectronicinvoicenu = eioldallelectronicinvoicenu " +
                 "    ,ei_invoicetime = eiinvoicetime,ei_invalidtime = eiinvalidtime,ei_rushredstate = eirushredstate " +
                 "    ,ei_invoicetime = eiinvoicetime,ei_invalidtime = eiinvalidtime,ei_rushredstate = eirushredstate " +
                 "    ,ei_pdfurl = eipdfurl,ei_ofdurl = eiofdurl,ei_imageurl = eiimageurl,ei_calcexcludingtaxamount = eicalcexcludingtaxamount,ei_calctaxamount = eicalctaxamount,ei_caleorderamount = eicaleorderamount " +
                 "    ,ei_pdfurl = eipdfurl,ei_ofdurl = eiofdurl,ei_imageurl = eiimageurl,ei_calcexcludingtaxamount = eicalcexcludingtaxamount,ei_calctaxamount = eicalctaxamount,ei_caleorderamount = eicaleorderamount " +
                 "    ,ei_sellertaxno = eisellertaxno,ei_sellername = eisellername,ei_taxno = eitaxno " +
                 "    ,ei_sellertaxno = eisellertaxno,ei_sellername = eisellername,ei_taxno = eitaxno " +
-                "    ,ei_buyername = eibuyername,ei_remark = eiremark,ei_clerker = eiclerker,ei_payee = eipayee,ei_checker = eichecker,ei_bfield1 = eibfield1,ei_bfield2 = eibfield2,ei_bfield3 = eibfield3 " +
+                "    ,ei_buyername = eibuyername,ei_remark = eiremark,ei_clerker = eiclerker,ei_payee = eipayee,ei_checker = eichecker,ei_bfield1 = eibfield1,ei_bfield2 = eibfield2,ei_bfield3 = eibfield3" +
+                "    ,ei_pdfattach=null " +//抓取后重新抓取附件
                 "when NOT MATCHED THEN insert (ei_id,ei_indate,ei_detno,ei_ioid,ei_iocode,ei_biid,ei_bicode " +
                 "when NOT MATCHED THEN insert (ei_id,ei_indate,ei_detno,ei_ioid,ei_iocode,ei_biid,ei_bicode " +
-                "    ,ei_sid,ei_orderno,ei_createtime,ei_invoicetype,ei_invoiceline,ei_specificfactor,ei_invoicestate,ei_exceptionmessage,ei_invoicecode,ei_invoicenumber " +
+                "    ,ei_refno,ei_sid,ei_orderno,ei_createtime,ei_invoicetype,ei_invoiceline,ei_specificfactor,ei_invoicestate,ei_exceptionmessage,ei_invoicecode,ei_invoicenumber " +
                 "    ,ei_allelectronicinvoicenumber,ei_oldinvoicecode,ei_oldinvoicenumber,ei_oldallelectronicinvoicenu,ei_invoicetime,ei_invalidtime,ei_rushredstate,ei_pdfurl,ei_ofdurl " +
                 "    ,ei_allelectronicinvoicenumber,ei_oldinvoicecode,ei_oldinvoicenumber,ei_oldallelectronicinvoicenu,ei_invoicetime,ei_invalidtime,ei_rushredstate,ei_pdfurl,ei_ofdurl " +
                 "    ,ei_imageurl,ei_calcexcludingtaxamount,ei_calctaxamount,ei_caleorderamount,ei_sellertaxno,ei_sellername,ei_taxno,ei_buyername,ei_remark,ei_clerker " +
                 "    ,ei_imageurl,ei_calcexcludingtaxamount,ei_calctaxamount,ei_caleorderamount,ei_sellertaxno,ei_sellername,ei_taxno,ei_buyername,ei_remark,ei_clerker " +
                 "    ,ei_payee,ei_checker,ei_bfield1,ei_bfield2,ei_bfield3) " +
                 "    ,ei_payee,ei_checker,ei_bfield1,ei_bfield2,ei_bfield3) " +
                 "values(elecinvoice_seq.nextval,sysdate,eidetno,io_id,io_code,io_biid,io_bicode " +
                 "values(elecinvoice_seq.nextval,sysdate,eidetno,io_id,io_code,io_biid,io_bicode " +
-                "    ,eisid,eiorderno,eicreatetime,eiinvoicetype,eiinvoiceline,eispecificfactor,eiinvoicestate,eiexceptionmessage,eiinvoicecode,eiinvoicenumber " +
+                "    ,eiRefno,eisid,eiorderno,eicreatetime,eiinvoicetype,eiinvoiceline,eispecificfactor,eiinvoicestate,eiexceptionmessage,eiinvoicecode,eiinvoicenumber " +
                 "    ,eiallelectronicinvoicenumber,eioldinvoicecode,eioldinvoicenumber,eioldallelectronicinvoicenu,eiinvoicetime,eiinvalidtime,eirushredstate,eipdfurl,eiofdurl " +
                 "    ,eiallelectronicinvoicenumber,eioldinvoicecode,eioldinvoicenumber,eioldallelectronicinvoicenu,eiinvoicetime,eiinvalidtime,eirushredstate,eipdfurl,eiofdurl " +
                 "    ,eiimageurl,eicalcexcludingtaxamount,eicalctaxamount,eicaleorderamount,eisellertaxno,eisellername,eitaxno,eibuyername,eiremark,eiclerker " +
                 "    ,eiimageurl,eicalcexcludingtaxamount,eicalctaxamount,eicaleorderamount,eisellertaxno,eisellername,eitaxno,eibuyername,eiremark,eiclerker " +
                 "    ,eipayee,eichecker,eibfield1,eibfield2,eibfield3)";
                 "    ,eipayee,eichecker,eibfield1,eibfield2,eibfield3)";
-        return sql;
-    }
-    private String numberField(Number v){
-        return (v == null ? "null" : v.toString());
+        sqls.add(sql);
+        if(relateRedInvoiceList !=null && relateRedInvoiceList.size()>0){//红冲数据更新
+            StringBuffer orderNos = new StringBuffer(); //红票开票单号 //  EI_redORDERNO
+            StringBuffer sids = new StringBuffer(); //红票流水号 EI_redSID
+            StringBuffer refnoS = new StringBuffer(); // 红字发票号 EI_RELATIVEREFNO
+            Double excludingTaxAmount = 0.0;//红票不含税金额 EI_TAXEXCLUDEDAMOUNT
+            Double taxAmount = 0.0;//红票税额  EI_TAXAMOUNT
+            // rushRedState 1 全冲  EI_RELATIVEREFNO	VARCHAR2(50 BYTE)	Yes		46	红字发票号
+            for (RelateRedInvoiceDTO rroDto : relateRedInvoiceList) {
+                orderNos.append(rroDto.getOrderNo()).append(",");
+                sids.append(rroDto.getSid()).append(",");
+                refnoS.append(StringUtil.nvl(rroDto.getAllElectronicInvoiceNumber(),rroDto.getInvoiceNumber())).append(",");
+                excludingTaxAmount = NumberUtil.add(excludingTaxAmount,rroDto.getExcludingTaxAmount());
+                taxAmount = NumberUtil.add(taxAmount,rroDto.getTaxAmount());
+            }
+            if(orderNos.length()>0){
+                sql = "update elecinvoice set " +
+                        "ei_redorderno='"+orderNos.substring(0,orderNos.length()-1)+"', " +
+                        "EI_redSID='"+sids.substring(0,sids.length()-1)+"', " +
+                        "ei_relativerefno='"+refnoS.substring(0,refnoS.length()-1)+"', " +
+                        "EI_TAXEXCLUDEDAMOUNT='"+excludingTaxAmount+"', " +
+                        "EI_TAXAMOUNT='"+taxAmount+"' " +
+                        ",ei_redpdfurl=null,ei_redpdfattach=null " +//抓取后重新抓取附件
+                        "where ei_ioid = "+ioid+" and ei_refno = "+getRefno();
+                sqls.add(sql);
+            }
+        }
+        return sqls;
     }
     }
-    private String stringField(String v){
-        return (v == null ? "null" : "'"+v+"'");
+    private String getRefno(){
+        //ei_refno = (case when ei_invoiceLine in ('bs','pc','es','ec') then ei_allElectronicInvoiceNumber else ei_invoiceNumber end)
+        return stringField(StringUtil.nvl(getAllElectronicInvoiceNumber(),getInvoiceNumber()));
     }
     }
-    private String timeField(String v){
-        return (v == null ? "null" : "(to_date('1970-01-0100:00:00','yyyy-mm-dd hh24:mi:ss') + "+v+"/1000/24/60/60)");
-    }
-
 }
 }

+ 13 - 0
src/main/java/com/uas/eis/dto/QSqlDTO.java

@@ -0,0 +1,13 @@
+package com.uas.eis.dto;
+
+public class QSqlDTO {
+    public String numberField(Object v){
+        return (v == null ? "null" : v.toString());
+    }
+    public String stringField(String v){
+        return ((v == null || "".equals(v) || "NULL".equals(v.toUpperCase())) ? "null" : "'"+v+"'");
+    }
+    public String timeField(String v){
+        return (v == null ? "null" : "(to_date('1970-01-0100:00:00','yyyy-mm-dd hh24:mi:ss') + "+v+"/1000/24/60/60)");
+    }
+}

+ 33 - 0
src/main/java/com/uas/eis/dto/QueryInvoiceRedConfirmDTO.java

@@ -0,0 +1,33 @@
+package com.uas.eis.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QueryInvoiceRedConfirmDTO{
+    private String billNo;//描述:红字确认单编号 示例值:1403011906000990
+    private String billUuid;//描述:红字确认单uuid 示例值:1d7f08b6ddb64cb19b095b0360f074d7
+    private String billId;//描述:红字确认单申请号 示例值:1119316085226510000
+    private String billStatus;//描述:红字确认单状态: 01 无需确认 02 销方录入待购方确认 03 购方录入待销方确认 04 购销双方已确认 05 作废(销方录入购方否认) 06 作废(购方录入销方否认) 07 作废(超72小时未确认) 08 作废(发起方已撤销) 09 作废(确认后撤销) 15 申请中 16 申请失败 示例值:1
+    private String billMessage;//描述:描述 示例值:
+    private String invoiceSerialNum;//描述:红票流水号,若红字确认单已开红票(或已自动开红票)才会返回该值 示例值:
+    private String orderNo;//描述:红票订单号(开票单号),若红字确认单已开红票(或已自动开红票)才会返回该值 示例值:
+    private String requestStatus;//描述:操作状态:(根据操作方返回对应状态,可能为空) 01 撤销中 02撤销失败 03 确认中 04 确认失败 示例值:操作状态:(根据操作方返回对应状态,可能为空) 01 撤销中 02撤销失败 03 确认中 04 确认失败
+    private String openStatus;//描述:已开具红字发票标记: 1:已开具 0:未开具 示例值:0
+    private String applySource;//描述:录入方身份: 0 销方 1 购方 示例值:0
+    private String blueInvoiceLine;//描述:蓝字发票票种: bs:电子发票(增值税专用发票), pc:电子发票(普通发票),es:全电纸质发票(增值税专用发票), ec:全电纸质发票(普通发票) 示例值:bs
+    private String blueInvoiceNumber;//描述:对应蓝票号码 示例值:对应蓝票号码
+    private String blueInvoiceTime;//描述:蓝字发票开票日期 示例值:
+    private String billTime;//描述:申请日期 示例值:43916.7806481481
+    private String confirmTime;//描述:确认日期 示例值:43917.7806481481
+    private String sellerTaxNo;//描述:销方税号 示例值:150301199811285000
+    private String sellerName;//描述:销方名称 示例值:测试税号326
+    private String buyerTaxNo;//描述:购方税号 示例值:150301199811285000
+    private String buyerName;//描述:购方名称 示例值:测试税号326
+    private String taxExcludedAmount;//描述:冲红合计金额(不含税) 示例值:-0.94
+    private String taxAmount;//描述:冲红合计税额 示例值:-0.06
+    private String redReason;//描述:冲红原因: 1销货退回 2开票有误 3服务中止 4销售折让 示例值:
+    private String pdfUrl;//描述:申请表pdf地址(暂不支持) 示例值:
+    private List<QueryInvoiceRedConfirmDetDTO> detail; //红字确认单明细信息列表
+}

+ 21 - 0
src/main/java/com/uas/eis/dto/QueryInvoiceRedConfirmDetDTO.java

@@ -0,0 +1,21 @@
+package com.uas.eis.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QueryInvoiceRedConfirmDetDTO {
+    private String blueDetailIndex;//描述:对应蓝票明细行序号 示例值:1
+    private String goodsName;//描述:商品名称 示例值:苹果
+    private String unit;//描述:单位 示例值:袋
+    private String specType;//描述:规格型号 示例值:规格型号
+    private String num;//描述:数量 示例值:-1
+    private String taxExcludedPrice;//描述:单价(不含税) 示例值:0.94
+    private String taxExcludedAmount;//描述:商品金额(不含税) 示例值:-0.94
+    private String taxAmount;//描述:商品税额 示例值:-0.06
+    private String taxRate;//描述:税率 示例值:0.06
+    private String goodsCode;//描述:商品编码 示例值:4020000000000000000
+    private String favouredPolicyFlag;//描述:01:简易征收 02:稀土产品 03:免税 04:不征税 05:先征后退 06:100%先征后退 07:50%先征后退 08:按3%简易征收 09:按5%简易征收 10:按5%简易征收减按1.5%计征 11:即征即退30% 12:即征即退50% 13:即征即退70% 14:即征即退100% 15:超税负3%即征即退 16:超税负8%即征即退 17:超税负12%即征即退 18:超税负6%即征即退 示例值:0
+    private String price;//描述:单价 示例值:0
+}

+ 16 - 0
src/main/java/com/uas/eis/dto/QueryInvoiceRedConfirmReq.java

@@ -0,0 +1,16 @@
+package com.uas.eis.dto;
+
+import lombok.Data;
+
+@Data
+public class QueryInvoiceRedConfirmReq {
+    private String identity;//必填:是 说明:操作方身份: 0销方 1购方
+    private String billStatus;//必填:否 说明:红字确认单状态(不传则查全部状态): 01 无需确认 02 销方录入待购方确认 03 购方录入待销方确认 04 购销双方已确认 05 作废(销方录入购方否认) 06 作废(购方录入销方否认) 07 作废(超72小时未确认) 08 作废(发起方已撤销) 09 作废(确认后撤销) 15 申请中 16 申请失败
+    private String billId;//必填:否 说明:红字确认单申请号
+    private String billNo;//必填:否 说明:红字确认单编号
+    private String billUuid;//必填:否 说明:红字确认单uuid
+    private String billTimeStart;//必填:否 说明:填开起始时间,确认单申请号/编号/uuid有值时,可为空,允许最大查询范围为90天
+    private String billTimeEnd;//必填:否 说明:填开结束时间,确认单申请号/编号/uuid有值时,可为空,允许最大查询范围为90天
+    private String pageSize;//必填:否 说明:每页数量(默认10,最大50)
+    private String pageNo;//必填:否 说明:当前页码(默认1)
+}

+ 9 - 0
src/main/java/com/uas/eis/dto/QueryInvoiceRedConfirmResp.java

@@ -0,0 +1,9 @@
+package com.uas.eis.dto;
+
+import com.uas.eis.dao.BaseNuoNuoQResp;
+import lombok.Data;
+
+@Data
+public class QueryInvoiceRedConfirmResp extends BaseNuoNuoQResp {
+    private QueryInvoiceRedConfirmRespDTO result;
+}

+ 12 - 0
src/main/java/com/uas/eis/dto/QueryInvoiceRedConfirmRespDTO.java

@@ -0,0 +1,12 @@
+package com.uas.eis.dto;
+
+import com.uas.eis.dao.BaseNuoNuoQResp;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QueryInvoiceRedConfirmRespDTO {
+    private int total;
+    private List<QueryInvoiceRedConfirmDTO> list;
+}

+ 93 - 0
src/main/java/com/uas/eis/dto/QueryInvoiceResultDTO.java

@@ -0,0 +1,93 @@
+package com.uas.eis.dto;
+
+//import com.uas.eis.core.enums.ElecISpecificFactor;
+import com.uas.eis.core.enums.ElecInVoiceSpecificFactor;
+import com.uas.eis.utils.StringUtil;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QueryInvoiceResultDTO extends QSqlDTO {
+    private String serialNo;//描述:发票请求流水号 示例值:19010211130401000000
+    private String orderNo;//描述:订单编号 示例值:1001000011161
+    private String status;//描述:发票状态: 2 :开票完成( 最终状 态),其他状态分别为: 20:开票中; 21:开票成功签章中;22:开票失败;24: 开票成功签章失败;3:发票已作废 31: 发票作废中 备注:22、24状态时,无需再查询,请确认开票失败原因以及签章失败原因; 注:请以该状态码区分发票状态 示例值:2
+    private String statusMsg;//描述:发票状态描述 示例值:开票完成(最终状态)
+    private String failCause;//描述:失败原因 示例值:
+    private String pdfUrl;//描述:发票pdf地址(若同时返回了ofdUrl与pdfUrl,则pdf文件不能做为原始凭证,请用ofd文件做为原始凭证) 示例值:https://invtest.jss.com.cn/group1/M00/0D/A4/wKjScVwsK6CAFzLgAABsVO-OKaE630.pdf
+    private String pictureUrl;//描述:发票图片地址 示例值:nnfpkf.jss.com.cn/ArQ6dFE3-9o5x4B
+    private String invoiceTime;//描述:开票时间 示例值:1546398919000
+    private String invoiceCode;//描述:发票代码(数电电票时为空,数电纸票时有值) 示例值:131880930199
+    private String invoiceNo;//描述:发票号码(数电电票时返回原来的20位数电票号码,数电纸票时为8位的纸票号码) 示例值:19902643
+    private String allElectronicInvoiceNumber;//描述:allElectronicInvoiceNumber 数电票号码(数电电票、数电纸票时均返回20位数电票号码) 示例值:22310000000000000000
+    private String exTaxAmount;//描述:不含税金额 示例值:0.38
+    private String taxAmount;//描述:合计税额 示例值:0.02
+    private String orderAmount;//描述:价税合计 示例值:0.4
+    private String payerName;//描述:购方名称(付款方名称) 示例值:个人2
+    private String payerTaxNo;//描述:购方税号(付款方税号) 示例值:110101TRDX8RQU1
+    private String address;//描述:购方地址 示例值:杭州西湖区
+    private String telephone;//描述:购方电话 示例值:13000000000
+    private String bankAccount;//描述:购方开户行及账号 示例值:中国工商银行000001
+    private String invoiceKind;//描述:发票种类,包含:增值税电子普通发票、增值税普通发票、专用发票(电子)、增值税专用发票、收购发票(电子)、收购发票(纸质)、增值税普通发票(卷式)、机动车销售统一发票、二手车销售统一发票、电子发票(增值税专用发票)、电子发票(普通发票)、全电纸质发票(增值税专用发票)、全电纸质发票(普通发票); 备注:电子发票(增值税专用发票)即 数电专票(电子),电子发票(普通发票)即 数电普票(电子) 示例值:增值税电子普通发票
+    private String checkCode;//描述:校验码(数电票时为空) 示例值:7.29697198825231E+19
+    private String qrCode;//描述:二维码 示例值:
+    private String machineCode;//描述:税控设备号(机器编码);数电票时为空 示例值:
+    private String cipherText;//描述:发票密文(数电票时为空) 示例值:
+    private String paperPdfUrl;//描述:含底图纸票pdf地址 示例值:http://invtest.nntest.cn/group1/M00/01/8B/wKjScV6-P0aAKKPHAAH965KBApQ812.pdf
+    private String ofdUrl;//描述:发票ofd地址(公共服务平台签章及数电电票时返回) 示例值:
+    private String xmlUrl;//描述:发票xml地址(数电电票且企业配置成支持获取xml时返回) 示例值:
+    private String clerk;//描述:开票员 示例值:张三
+    private String payee;//描述:收款人 示例值:李四
+    private String checker;//描述:复核人 示例值:王五
+    private String salerAccount;//描述:销方银行账号 示例值:2000098287777
+    private String salerTel;//描述:销方电话 示例值:0937-9384
+    private String salerAddress;//描述:销方地址 示例值:杭州西湖
+    private String salerTaxNum;//描述:销方税号 示例值:150301199811285000
+    private String saleName;//描述:销方名称 示例值:浙江诺诺网
+    private String remark;//描述:备注 示例值:备注mlk
+    private String productOilFlag;//描述:成品油标志:0非成品油,1成品油 示例值:0
+    private String imgUrls;//描述:图片地址(多个图片以逗号隔开) 示例值:http://invtest.nntest.cn/group1/M00/01/8B/wKjScV6-P0WAHjKkAAC17-oX9RE037.jpg
+    private String extensionNumber;//描述:分机号 示例值:1
+    private String terminalNumber;//描述:终端号 示例值:
+    private String deptId;//描述:部门门店id(诺诺系统中的id) 示例值:1
+    private String clerkId;//描述:开票员id(诺诺系统中的id) 示例值:1
+    private String oldInvoiceCode;//描述:对应蓝票发票代码,红票时有值(蓝票为数电电票时为空,数电纸票时有值) 示例值:
+    private String oldInvoiceNo;//描述:对应蓝票发票号码,红票时有值(蓝票为数电电票时返回原来的20位数电票号码,数电纸票时为8位的纸票号码) 示例值:
+    private String oldEleInvoiceNumber;//描述:对应蓝票数电票号码,红票时有值(蓝票为数电票(电子+纸质)时 20位) 示例值:
+    private String listFlag;//描述:清单标志:0,非清单;1,清单票 示例值:0
+    private String listName;//描述:清单项目名称:打印清单时对应发票票面项目名称,注意:税总要求清单项目名称为(详见销货清单) 示例值:
+    private String phone;//描述:购方手机(开票成功会短信提醒购方) 示例值:
+    private String notifyEmail;//描述:购方邮箱推送邮箱(开票成功会邮件提醒购方) 示例值:
+    private String vehicleFlag;//描述:是否机动车类专票 0-否 1-是 示例值:0
+    private String createTime;//描述:数据创建时间(回传其他信息时返回) 示例值:
+    private String updateTime;//描述:数据更新时间(回传其他信息时返回) 示例值:
+    private String stateUpdateTime;//描述:发票状态更新时间(回传其他信息时返回;涉及状态:开票中、开票失败、开票成功签章中、开票成功签章失败、开票完成、发票作废中、发票已作废) 示例值:
+    private String proxyInvoiceFlag;//描述:代开标志 0-非代开 1-代开(回传其他信息时返回) 示例值:
+    private String invoiceDate;//描述:用于开票的订单的时间(回传其他信息时返回) 示例值:
+    private String invoiceType;//描述:开票类型 1-蓝票 2-红票(回传其他信息时返回) 示例值:1
+    private String redReason;//描述:冲红原因 1:销货退回;2:开票有误;3:服务中止;4:发生销售折让(红票且票种为p、c、e、f、r(成品油发票除外)且回传其他信息时返回) 示例值:1
+    private String invalidTime;//描述:作废时间(已作废状态下的发票,且回传其他信息时返回) 示例值:1625475746
+    private String invalidSource;//描述:作废来源 1-诺诺工作台 2-API接口 3-开票软件 4-验签失败作废 5-其他(已作废状态下的发票,且回传其他信息时返回) 示例值:1
+    private String invalidReason;//描述:数电纸票作废原因 1:销货退回;2:开票有误;3:服务中止;4:其他(已作废状态下的发票,且票为数电纸票且回传其他信息时返回) 示例值:
+    private String specificReason;//描述:其他作废原因详情(作废原因为4 且回传其他信息时返回) 示例值:
+    private Integer specificFactor;//描述:发票特定要素:(后续枚举值会有扩展,回传其他信息时返回)0-普通 1-成品油发票 3-建筑服务 4-货物运输服务 6-不动产经营租赁服务 9-旅客运输服务 16-农产品收购 31-建安发票 32-房地产销售发票 33-二手车发票反向开具 34-电子烟 35-矿产品 示例值:0
+    private String emailNotifyStatus;//描述:邮箱交付状态(0-未交付,1-交付成功,2-交付失败,3-交付中,4-不会交付;注:回传其他信息时返回) 示例值:
+    private String phoneNotifyStatus;//描述:手机交付状态(0-未交付,1-交付成功,2-交付失败,3-交付中,4-不会交付;注:回传其他信息时返回) 示例值:
+    private String buyerManagerName;//描述:购买方经办人姓名(数电票特有字段) 示例值:张三
+    private String managerCardType;//描述:经办人证件类型:101-组织机构代码证, 102-营业执照, 103-税务登记证, 199-其他单位证件, 201-居民身份证, 202-军官证, 203-武警警官证, 204-士兵证, 205-军队离退休干部证, 206-残疾人证, 207-残疾军人证(1-8级), 208-外国护照, 210-港澳居民来往内地通行证, 212-中华人民共和国往来港澳通行证, 213-台湾居民来往大陆通行证, 214-大陆居民往来台湾通行证, 215-外国人居留证, 216-外交官证 299-其他个人证件(数电票特有) 示例值:201
+    private String managerCardNo;//描述:经办人证件号码(数电票特有字段) 示例值:
+    private String bField1;//描述:业务方自定义字段1 示例值:
+    private String bField2;//描述:业务方自定义字段2 示例值:
+    private String bField3;//描述:业务方自定义字段3 示例值:
+    private String naturalPersonFlag;//描述:购买方自然人标志:0-否,1-是(数电普票(电子)时才有可能返回,为1时,版式文件上在购方名称最后面会额外显示 (个人) ) 示例值:
+    public String updatePdfUrlSql(){//更新 红票PDFURL附件
+        String sql = "";
+        if(StringUtil.hasText(serialNo)){
+            sql= "update ElecInvoice set EI_REDPDFURL = "+stringField(pdfUrl)+ " where EI_REFNO = "+getBlueRefno();
+        }
+        return sql;
+    }
+    private String getBlueRefno(){
+        return stringField(StringUtil.nvl(oldEleInvoiceNumber,oldInvoiceNo));
+    }
+}

+ 12 - 0
src/main/java/com/uas/eis/dto/QueryInvoiceResultReq.java

@@ -0,0 +1,12 @@
+package com.uas.eis.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QueryInvoiceResultReq {
+    private List<String> serialNos; //发票流水号,两字段二选一,同时存在以流水号为准(最多查50个订单号)
+    private List<String> orderNos;//订单编号(最多查50个订单号)
+    private String isOfferInvoiceDetail;//是否需要提供明细 1-是, 0-否(不填默认 0)
+}

+ 11 - 0
src/main/java/com/uas/eis/dto/QueryInvoiceResultResp.java

@@ -0,0 +1,11 @@
+package com.uas.eis.dto;
+
+import com.uas.eis.dao.BaseNuoNuoQResp;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QueryInvoiceResultResp extends BaseNuoNuoQResp {
+    private List<QueryInvoiceResultDTO> result;
+}

+ 3 - 3
src/main/java/com/uas/eis/dto/RelateRedInvoiceDTO.java

@@ -10,7 +10,7 @@ public class RelateRedInvoiceDTO {
     private String invoiceNumber;//红票发票号码
     private String invoiceNumber;//红票发票号码
     private String allElectronicInvoiceNumber;//allElectronicInvoiceNumber,红票数电票号码
     private String allElectronicInvoiceNumber;//allElectronicInvoiceNumber,红票数电票号码
     private String invoiceTime;//红票开票日期
     private String invoiceTime;//红票开票日期
-    private Number orderAmount;//红票含税金额
-    private Number excludingTaxAmount;//红票不含税金额
-    private Number taxAmount;//红票税额
+    private Double orderAmount;//红票含税金额
+    private Double excludingTaxAmount;//红票不含税金额
+    private Double taxAmount;//红票税额
 }
 }

+ 2 - 0
src/main/java/com/uas/eis/service/CommonService.java

@@ -11,8 +11,10 @@ import java.util.Map;
 public interface CommonService {
 public interface CommonService {
     //记录成功日志
     //记录成功日志
     void logSRecord(String code_,int keyvalue_);
     void logSRecord(String code_,int keyvalue_);
+    void logSRecordBycon(String code_,String keyvalue_field,String logTab, String con);
     //记录失败日志
     //记录失败日志
     void logFRecord(String code_,String err_,int keyvalue_);
     void logFRecord(String code_,String err_,int keyvalue_);
+    void logFRecordBycon(String code_,String keyvalue_field,String logTab, String con, String err_);
 
 
     int saveFilePath(String path, int size, String fileName, String emName);
     int saveFilePath(String path, int size, String fileName, String emName);
 }
 }

+ 4 - 2
src/main/java/com/uas/eis/service/ERPService.java

@@ -3,6 +3,7 @@ package com.uas.eis.service;
 
 
 import com.uas.eis.sdk.entity.ApiResult;
 import com.uas.eis.sdk.entity.ApiResult;
 
 
+import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
 /**
 /**
@@ -16,7 +17,8 @@ public interface ERPService {
     Map<String, Object> findOrderState(String master,int id);
     Map<String, Object> findOrderState(String master,int id);
     Map<String, Object> cancelInvoiceOrder(String master, int id);
     Map<String, Object> cancelInvoiceOrder(String master, int id);
     Map<String, Object> getElecInvoicesById(String master, Integer id);
     Map<String, Object> getElecInvoicesById(String master, Integer id);
-    Map<String, Object> getElecInvoices(String appKey,String appSecret,String token,String taxnum,int ioid,String ioCode);
+    Map<String, Object> getElecInvoices(Map<String,Object> m);
     Map<String, Object> rushRed(String master, int id);
     Map<String, Object> rushRed(String master, int id);
-    void queryInvoiceRedConfirm(String taxnum, String appKey, String appSecret, String token,String url,String redApplyId);
+    Map<String, Object> queryInvoiceRedConfirm(Map<String,Object> m);
+    Map<String,Object> queryRedPdfUrl(List<String> serialNosAll, Map<String,Object> m);
 }
 }

+ 10 - 1
src/main/java/com/uas/eis/service/Impl/CommonServiceImpl.java

@@ -19,12 +19,21 @@ public class CommonServiceImpl implements CommonService {
     public void logSRecord(String code_, int keyvalue_) {
     public void logSRecord(String code_, int keyvalue_) {
         baseDao.execute("insert into invoicedockLog(id_,code_,date_,result_,keyvalue_) values (invoicedockLog_seq.nextval,?,sysdate,'SUCCEED',?)",code_,keyvalue_);
         baseDao.execute("insert into invoicedockLog(id_,code_,date_,result_,keyvalue_) values (invoicedockLog_seq.nextval,?,sysdate,'SUCCEED',?)",code_,keyvalue_);
     }
     }
-
+    @Override
+    public void logSRecordBycon(String code_,String keyvalue_field,String logTab, String con) {
+        baseDao.execute("insert into invoicedockLog(id_,code_,date_,result_,keyvalue_) " +
+                "select invoicedockLog_seq.nextval,'"+code_+"',sysdate,'SUCCEED',id_ from ( select min("+keyvalue_field+") id_ from "+logTab+" where "+con+")");
+    }
     @Override
     @Override
     public void logFRecord(String code_, String err_, int keyvalue_) {
     public void logFRecord(String code_, String err_, int keyvalue_) {
         baseDao.execute("insert into invoicedockLog(id_,code_,date_,result_,err_,keyvalue_) values (invoicedockLog_seq.nextval,?,sysdate,'FAILED',?,?)",code_,err_,keyvalue_);
         baseDao.execute("insert into invoicedockLog(id_,code_,date_,result_,err_,keyvalue_) values (invoicedockLog_seq.nextval,?,sysdate,'FAILED',?,?)",code_,err_,keyvalue_);
     }
     }
     @Override
     @Override
+    public void logFRecordBycon(String code_,String keyvalue_field,String logTab, String con, String err_) {
+        baseDao.execute("insert into invoicedockLog(id_,code_,date_,result_,err_,keyvalue_) " +
+                "select invoicedockLog_seq.nextval,'"+code_+"',sysdate,'FAILED','"+err_+"',id_ from ( select min("+keyvalue_field+") id_ from "+logTab+" where "+con+")");
+    }
+    @Override
     public int saveFilePath(String path, int size, String fileName, String emName) {
     public int saveFilePath(String path, int size, String fileName, String emName) {
         int id = baseDao.getSeqId("EMAILFILEPATH");
         int id = baseDao.getSeqId("EMAILFILEPATH");
         if (path.contains("\\")) {//上传到本地返回路径修改
         if (path.contains("\\")) {//上传到本地返回路径修改

+ 225 - 54
src/main/java/com/uas/eis/service/Impl/ERPServiceImpl.java

@@ -7,13 +7,13 @@ import com.uas.eis.config.DonlimConfig;
 import com.uas.eis.core.config.SpObserver;
 import com.uas.eis.core.config.SpObserver;
 import com.uas.eis.core.support.TokenProperties;
 import com.uas.eis.core.support.TokenProperties;
 import com.uas.eis.dao.*;
 import com.uas.eis.dao.*;
-import com.uas.eis.dto.FindOrderRelationInvoiceDTO;
-import com.uas.eis.dto.FindOrderRelationInvoiceReq;
-import com.uas.eis.dto.FindOrderRelationInvoiceResp;
+import com.uas.eis.dto.*;
 import com.uas.eis.service.CommonService;
 import com.uas.eis.service.CommonService;
 import com.uas.eis.service.ERPService;
 import com.uas.eis.service.ERPService;
+import com.uas.eis.service.NuoNuoSDKService;
 import com.uas.eis.utils.*;
 import com.uas.eis.utils.*;
 import nuonuo.open.sdk.NNOpenSDK;
 import nuonuo.open.sdk.NNOpenSDK;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,6 +21,8 @@ import org.springframework.stereotype.Service;
 
 
 import java.text.SimpleDateFormat;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 
 /**
 /**
  * @author koul
  * @author koul
@@ -39,6 +41,8 @@ public class ERPServiceImpl implements ERPService {
     private DonlimConfig donlimConfig;
     private DonlimConfig donlimConfig;
     @Autowired
     @Autowired
     private CommonService commonService;
     private CommonService commonService;
+    @Autowired
+    private NuoNuoSDKService nuoNuoSDKService;
     @Override
     @Override
     public Map<String, Object> pushInvoiceOrder(String master, int id) {
     public Map<String, Object> pushInvoiceOrder(String master, int id) {
         Map<String, Object> map = new HashMap<String, Object>();
         Map<String, Object> map = new HashMap<String, Object>();
@@ -293,18 +297,27 @@ public class ERPServiceImpl implements ERPService {
             token = obs[2].toString();// 访问令牌
             token = obs[2].toString();// 访问令牌
             taxnum = obs[3].toString();// 授权企业税号
             taxnum = obs[3].toString();// 授权企业税号
         }
         }
+        Map<String,Object> m = new HashMap<>();
+        m.put("appKey",appKey);
+        m.put("appSecret",appSecret);
+        m.put("token",token);
+        m.put("taxnum",taxnum);
         SpObserver.putSp(master);
         SpObserver.putSp(master);
         SqlRowList ioList = baseDao.queryForRowSet("select io_id,io_code from "+master+".invoiceOrder left join "+master+".customer on io_cucode=cu_code " +
         SqlRowList ioList = baseDao.queryForRowSet("select io_id,io_code from "+master+".invoiceOrder left join "+master+".customer on io_cucode=cu_code " +
                 " where io_id = "+id);
                 " where io_id = "+id);
         while(ioList.next()) {
         while(ioList.next()) {
-            map = getElecInvoices(appKey,appSecret,token,taxnum,ioList.getGeneralInt("io_id"),ioList.getGeneralString("io_code"));
+            m.put("io_id",ioList.getGeneralInt("io_id"));
+            m.put("io_code",ioList.getGeneralString("io_code"));
+            map = getElecInvoices(m);
         }
         }
         return map;
         return map;
     }
     }
     @Override
     @Override
-    public Map<String, Object> getElecInvoices(String appKey,String appSecret,String token,String taxnum,int ioid,String ioCode){
+    public Map<String, Object> getElecInvoices(Map<String,Object> m){
+        String taxnum = m.get("taxnum").toString();
+        int ioid = Integer.valueOf(m.get("io_id").toString());
+        String ioCode = m.get("io_code").toString();
         Map<String, Object> res = new HashMap<String, Object>();
         Map<String, Object> res = new HashMap<String, Object>();
-        String url=donlimConfig.getRoute();
         String errCode = "-999";
         String errCode = "-999";
         String errMsg = "";
         String errMsg = "";
         try {
         try {
@@ -312,38 +325,41 @@ public class ERPServiceImpl implements ERPService {
             FindOrderRelationInvoiceReq foriReq = new FindOrderRelationInvoiceReq();
             FindOrderRelationInvoiceReq foriReq = new FindOrderRelationInvoiceReq();
             foriReq.setOriginalOrderNo(ioCode);//订单编号
             foriReq.setOriginalOrderNo(ioCode);//订单编号
             foriReq.setSaleTaxNum(taxnum);//销方税号
             foriReq.setSaleTaxNum(taxnum);//销方税号
-            foriReq.setNeedInvoiceSourceDetail("0");//是否需要发票所来源的订单明细,1-是, 0-否(不填默认 0) 当为0时,将不回传orderDetailCallBackVOS。先默认不需要明细
-
-            NNOpenSDK sdk = NNOpenSDK.getIntance();
-            String method = "nuonuo.OpeMplatform.findOrderRelationInvoice"; // API方法名
-            String content =sdk.convertToUtf8(JSONArray.toJSONString(foriReq));
-            String senid = UUID.randomUUID().toString().replace("-", ""); // 唯一标识,32位随机码,无需修改,保持默认即可
-            String result = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content);
-
-            FindOrderRelationInvoiceResp resp = JSON.parseObject(result , new TypeReference<FindOrderRelationInvoiceResp>() {});
+            foriReq.setNeedInvoiceSourceDetail("1");//是否需要发票所来源的订单明细,1-是, 0-否(不填默认 0) 当为0时,将不回传orderDetailCallBackVOS。先默认不需要明细
+            FindOrderRelationInvoiceResp resp = nuoNuoSDKService.findOrderRelationInvoice(foriReq,m);
             errCode = resp.getStatus();
             errCode = resp.getStatus();
             errMsg = resp.getMessage();
             errMsg = resp.getMessage();
-            logger.info("ElecInvoice-DownLoad-master: {} ,id {} status {} message {}",SpObserver.getSp(),ioid,errCode,errMsg);
+            logger.info("ElecI-DownLoad-master: {} ,id {} status {} message {}",SpObserver.getSp(),ioid,errCode,errMsg);
             if("0000".equals(errCode)){//调用成功
             if("0000".equals(errCode)){//调用成功
                 //记录发票明细
                 //记录发票明细
                 baseDao.execute(getElecInvoicesSqls(ioid,resp.getData()));
                 baseDao.execute(getElecInvoicesSqls(ioid,resp.getData()));
+                //红字
                 commonService.logSRecord("订单关联发票对接",ioid);
                 commonService.logSRecord("订单关联发票对接",ioid);
             }else if(!"8958".equals(errCode)){//  {"status":"8958","message":"该订单对应的开票单不存在","data":null} 没有开票单的不记录对接失败日志
             }else if(!"8958".equals(errCode)){//  {"status":"8958","message":"该订单对应的开票单不存在","data":null} 没有开票单的不记录对接失败日志
-                if(errMsg.length() > 3990){
-                    errMsg = errMsg.substring(0,3990);
+                if(errMsg.length() > 3980){
+                    errMsg = errMsg.substring(0,3980);
                 }
                 }
-                baseDao.execute("update invoiceOrder set io_errorMsg='"+errMsg+"' where io_id="+ioid);
+                baseDao.execute("update invoiceOrder set io_errorMsg='订单关联发票查询失败: "+errMsg+"' where io_id="+ioid);
                 commonService.logFRecord("订单关联发票对接","("+errCode+")"+errMsg,ioid);
                 commonService.logFRecord("订单关联发票对接","("+errCode+")"+errMsg,ioid);
             }
             }
         }catch (Exception e){
         }catch (Exception e){
+            e.printStackTrace();
             errMsg = "发票获取异常";
             errMsg = "发票获取异常";
             if(StringUtil.hasText(e.getMessage())){
             if(StringUtil.hasText(e.getMessage())){
                 errMsg = e.getMessage();
                 errMsg = e.getMessage();
             }else if(e.getCause()!=null&&StringUtil.hasText(e.getCause().getMessage())){
             }else if(e.getCause()!=null&&StringUtil.hasText(e.getCause().getMessage())){
                 errMsg = e.getCause().getMessage();
                 errMsg = e.getCause().getMessage();
             }
             }
+            logger.info("ElecI-DownLoad-master: {} ,id {} message {}",SpObserver.getSp(),ioid,errMsg);
             commonService.logFRecord("订单关联发票对接",errMsg.replaceAll("'","''"),ioid);
             commonService.logFRecord("订单关联发票对接",errMsg.replaceAll("'","''"),ioid);
         }
         }
+        //获取红字发票PDF地址
+        List<String> serialNosAll = baseDao.queryForList("select ei_redsid from ElecInvoice " +
+                "where ei_ioid = "+ioid+" and EI_RELATIVEREFNO is not null and ei_redpdfurl is null and nvl(EI_BILLSTATUS,' ') in (' ','01','04')",String.class);
+        if (!CollectionUtil.isEmpty(serialNosAll)){
+            queryRedPdfUrl(serialNosAll,m);
+        }
+//        queryRedPdfUrl()
         if(StringUtil.hasText(errMsg)&&!"调用成功".equals(errMsg)){
         if(StringUtil.hasText(errMsg)&&!"调用成功".equals(errMsg)){
             res.put("success", false);
             res.put("success", false);
             res.put("errCode", errCode);
             res.put("errCode", errCode);
@@ -353,6 +369,23 @@ public class ERPServiceImpl implements ERPService {
         }
         }
         return res;
         return res;
     }
     }
+    private List<String> getElecInvoicesSqls(int ioid,List<FindOrderRelationInvoiceDTO> data){
+        List<String> sqls = new ArrayList<String>();
+        boolean syncToBillOut = baseDao.isDBSetting("BillOut","syncToBillOut");
+        for (int i = 0; i < data.size(); i++) {
+            FindOrderRelationInvoiceDTO friDto = data.get(i);
+            sqls.addAll(friDto.toMergeSql(ioid,(i+1)));
+        }
+        sqls.add("update invoiceOrder set io_refno = (select (min(ei_refno)||(case when max(ei_refno) <> min(ei_refno) then '-'||max(ei_refno) else '' end)) from ELECINVOICE where ei_ioid = io_id and EI_INVOICETYPE= 1 and nvl(ei_rushredstate,0) <> 1)" +
+                "where io_id = "+ioid);
+        //更新开票记录
+        if(syncToBillOut){
+            sqls.add("update BillOut set bi_refno = (select max(io_refno) from invoiceOrder where io_id = "+ioid+" and io_biid = bi_id) where bi_id in (select io_biid from invoiceOrder where io_id = "+ioid+" and io_refno is not null)");
+        }
+//        System.out.println("sqls:");
+//        System.out.println(sqls.toString());
+        return sqls;
+    }
 
 
     @Override
     @Override
     public Map<String, Object> rushRed(String master, int id) {
     public Map<String, Object> rushRed(String master, int id) {
@@ -369,10 +402,18 @@ public class ERPServiceImpl implements ERPService {
             token = obs[2].toString();// 访问令牌
             token = obs[2].toString();// 访问令牌
             taxnum = obs[3].toString();// 授权企业税号
             taxnum = obs[3].toString();// 授权企业税号
         }
         }
+        Map<String,Object> m = new HashMap<>();
+        m.put("appKey",appKey);
+        m.put("appSecret",appSecret);
+        m.put("token",token);
+        m.put("taxnum",taxnum);
         logger.info("rushRed begin: master {} ,id {} ",master,id);
         logger.info("rushRed begin: master {} ,id {} ",master,id);
         SpObserver.putSp(master);
         SpObserver.putSp(master);
+        StringBuffer errmsg = new StringBuffer();
+        StringBuffer remindmsg = new StringBuffer();
         SqlRowList rs_main = baseDao.queryForRowSet("select * from invoiceOrder left join customer on io_cucode=cu_code left join elecinvoice on io_id=ei_ioid where io_id="+id);
         SqlRowList rs_main = baseDao.queryForRowSet("select * from invoiceOrder left join customer on io_cucode=cu_code left join elecinvoice on io_id=ei_ioid where io_id="+id);
         if (rs_main.hasNext()){
         if (rs_main.hasNext()){
+            int scount = 0;
             while(rs_main.next()){
             while(rs_main.next()){
                 RedInvoiceReq redInvoiceReq=new RedInvoiceReq();
                 RedInvoiceReq redInvoiceReq=new RedInvoiceReq();
                 redInvoiceReq.setBlueInvoiceLine(rs_main.getGeneralString("io_invoiceline"));//蓝票发票种类
                 redInvoiceReq.setBlueInvoiceLine(rs_main.getGeneralString("io_invoiceline"));//蓝票发票种类
@@ -392,55 +433,185 @@ public class ERPServiceImpl implements ERPService {
                 Object code=res.get("code");
                 Object code=res.get("code");
                 Object describe=res.get("describe");
                 Object describe=res.get("describe");
                 Object result=res.get("result");
                 Object result=res.get("result");
+                logger.info("rushRed master {} ,id {} code {} describe {} applycode {}",master,id,code,describe,result);
                 if(code !=null && "E0000".equals(code.toString())){//调用成功
                 if(code !=null && "E0000".equals(code.toString())){//调用成功
                     baseDao.execute("update elecinvoice set ei_redapplyid='"+result.toString()+"' where ei_id="+rs_main.getGeneralInt("ei_id"));
                     baseDao.execute("update elecinvoice set ei_redapplyid='"+result.toString()+"' where ei_id="+rs_main.getGeneralInt("ei_id"));
-                    queryInvoiceRedConfirm( taxnum,  appKey,  appSecret,  token, url, result.toString());
+                    scount++;
                     commonService.logSRecord("红字确认单申请("+rs_main.getGeneralString("ei_refno")+")",id);
                     commonService.logSRecord("红字确认单申请("+rs_main.getGeneralString("ei_refno")+")",id);
                 }else{
                 }else{
+                    //E9755 describe 该发票存在进行中的红字确认单,暂时不能冲红
                     commonService.logFRecord("红字确认单申请("+rs_main.getGeneralInt("ei_id")+")","("+code+")"+describe,id);
                     commonService.logFRecord("红字确认单申请("+rs_main.getGeneralInt("ei_id")+")","("+code+")"+describe,id);
-                    map.put("success", false);
-                    map.put("message", "("+code+")"+describe);
-                    return map;
+                    errmsg.append("("+code+")"+describe).append("</br>");
                 }
                 }
-                logger.info("rushRed master {} ,id {} code {} describe {} applycode{}",master,id,code,describe,result);
             }
             }
-        }else{//数据无效
+            //没有自动开红票 但是可以拿状态
+            if(scount > 0){
+                m.put("io_id",id);
+                m.put("ei_id",0);
+                //获取红字确认状态等信息,若自动开票成功,则同时获取红票信息
+                Map<String, Object> mm = queryInvoiceRedConfirm(m);
+                if("false".equals(mm.get("success"))&&StringUtil.hasText(mm.get("errMsg"))){
+                    remindmsg.append(mm.get("errMsg"));
+                }
+            }
+        } else {//数据无效
             logger.info("rushRed err {对接源信息无效} ,master {} , id {} status {} message {}",master,id);
             logger.info("rushRed err {对接源信息无效} ,master {} , id {} status {} message {}",master,id);
-            map.put("success", false);
-            map.put("message", "对接源信息无效");
+            errmsg.append("对接源信息无效");
             return map;
             return map;
         }
         }
-        map.put("success", true);
+        if(errmsg.length()>0){
+            map.put("success", false);
+            if(remindmsg.length()>0){
+                errmsg.append(remindmsg.toString());
+            }
+            map.put("message", errmsg.toString());
+        }else {
+            map.put("success", true);
+            if(remindmsg.length()>0){
+                map.put("message", remindmsg.toString());
+            }
+        }
         return map;
         return map;
     }
     }
-
+    /*
+        条件:蓝票、有确认单号、待确认或者无需确认的情况下 持续获取红票相关信息
+        按照红冲确认单查询对应状态
+            可以查到信息: 确认单状态、开票状态、冲红原因、
+        若已开票,则自动获取红票 发票号:
+        冲红原因: 1销货退回 2开票有误 3服务中止 4销售折让
+     */
     @Override
     @Override
-    public void queryInvoiceRedConfirm(String taxnum, String appKey, String appSecret, String token,String url,String redApplyId) {
-        NNOpenSDK sdk = NNOpenSDK.getIntance();
-        String method = "nuonuo.OpeMplatform.queryInvoiceRedConfirm"; // API方法名
-        Map<String,String> reqParam=new HashMap<>();
-        reqParam.put("identity","0");
-        reqParam.put("billId",redApplyId);
-        String content=JSONArray.toJSONString(reqParam);
-        String senid = UUID.randomUUID().toString().replace("-", ""); // 唯一标识,32位随机码,无需修改,保持默认即可
-        String result = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content);
-        System.out.println(result);
-    }
-
-    private List<String> getElecInvoicesSqls(int ioid,List<FindOrderRelationInvoiceDTO> data){
-        List<String> sqls = new ArrayList<String>();
-        boolean syncToBillOut = baseDao.isDBSetting("BillOut","syncToBillOut");
-        for (int i = 0; i < data.size(); i++) {
-            sqls.add(data.get(i).toMergeSql(ioid,(i+1)));
+    public Map<String, Object> queryInvoiceRedConfirm(Map<String,Object> m) {
+        int ioid = Integer.valueOf(m.get("io_id").toString());
+        int eiid = Integer.valueOf(m.get("ei_id").toString());
+        Map<String, Object> res = new HashMap<String, Object>();
+        StringBuffer errmsg = new StringBuffer();
+        SqlRowList bluePiao = baseDao.queryForRowSet("select ei_id,ei_redapplyid,ei_billStatus,ei_billNo,ei_billUuid,ei_taxExcludedAmount,ei_taxAmount,ei_redReason " +
+                "from elecinvoice " +
+                "where ei_ioid = '"+ioid+"' "+(eiid>0?"and ei_id = "+eiid:"")
+                +" and EI_INVOICETYPE = '1' and ei_redapplyid is not null and EI_RELATIVEREFNO is null and nvl(ei_billStatus,' ') in (' ','01','02','03') " +
+                "order by ei_Detno");
+        if(bluePiao.hasNext()){
+            boolean isRushRedBill = false;
+            while (bluePiao.next()){
+                String redApplyId =bluePiao.getGeneralString("ei_redapplyid");
+                eiid = bluePiao.getGeneralInt("ei_id");
+                m.put("ei_id",eiid);
+                QueryInvoiceRedConfirmReq qircReq = new QueryInvoiceRedConfirmReq();
+                qircReq.setIdentity("0");
+                qircReq.setBillId(redApplyId);
+                String rCode = "-999";
+                String describe = "";
+                String logCode = "发票红字确认状态查询";
+                try {
+                    QueryInvoiceRedConfirmResp qircResp = nuoNuoSDKService.queryInvoiceRedConfirm(qircReq,m);
+                    rCode = qircResp.getCode();
+                    describe = qircResp.getDescribe();
+                    logger.info("ElecI-queryInvoiceRedConfirmByCode:master {} ,redApplyid {} rCode {} describe {} total {}",SpObserver.getSp(),redApplyId,rCode,describe,qircResp.getResult().getTotal());
+                    if("E0000".equals(rCode)){//调用成功 记录发票明细 1135624457459470336
+                        List<String> sqls = new ArrayList<>();
+                        List<QueryInvoiceRedConfirmDTO> qircList = qircResp.getResult().getList();
+                        for (int i = 0; i < qircList.size(); i++) {
+                            QueryInvoiceRedConfirmDTO qircfDTO = qircList.get(i);
+                            //先获取红票状态 不一致才更新
+                            sqls.add("update elecinvoice set " +
+                                    "ei_billStatus='"+qircfDTO.getBillStatus()+"' " +
+                                    ",ei_billNo='"+StringUtil.nvl(qircfDTO.getBillNo(),"")+"' " + //990000008655037292
+                                    ",ei_billUuid='"+StringUtil.nvl(qircfDTO.getBillUuid(),"")+"' " +
+                                    ",ei_redsid='"+StringUtil.nvl(qircfDTO.getInvoiceSerialNum(),"")+"' " +
+                                    ",ei_redorderno='"+StringUtil.nvl(qircfDTO.getOrderNo(),"")+"' " +
+                                    ",ei_taxExcludedAmount='"+StringUtil.nvl(qircfDTO.getTaxExcludedAmount(),"0")+"' " +
+                                    ",ei_taxAmount='"+StringUtil.nvl(qircfDTO.getTaxAmount(),"0")+"' " +
+                                    ",ei_redReason='"+StringUtil.nvl(qircfDTO.getRedReason(),"")+"' " +
+                                    ",ei_openStatus='"+StringUtil.nvl(qircfDTO.getOpenStatus(),"0")+"' " +
+                                    " where ei_id = "+eiid);
+                            //针对自动开票场景:若开票,则记录红票数据,调用查询接口批量更新
+                            if("1".equals(qircfDTO.getOpenStatus())){ //已开具红字发票标记: 1:已开具 0:未开具 //orderNo 20230731182154174492
+                                isRushRedBill = true;
+                                // serialNos 流水号 -- EI_SID -- invoiceSerialNum ; orderNos 开票单号 --- EI_ORDERNO -- ORDERNO
+                            }
+                        }
+                        baseDao.execute(sqls);
+                        describe = "";
+                    }else{
+                        if(describe.length() > 3980){
+                            describe = describe.substring(0,3980);
+                        }
+                        errmsg.append(describe).append("</br>");
+                        baseDao.execute("update elecinvoice set io_errorMsg='"+logCode+": "+describe+"' where ei_id = "+eiid+" ");
+                        commonService.logFRecord(logCode,describe,eiid);
+                    }
+                }catch (Exception e){
+                    e.printStackTrace();
+                    describe = "未知异常";
+                    if(StringUtil.hasText(e.getMessage())){
+                        describe = e.getMessage();
+                    }else if(e.getCause()!=null&&StringUtil.hasText(e.getCause().getMessage())){
+                        describe = e.getCause().getMessage();
+                    }
+                    commonService.logFRecord(logCode,"发票红冲状态查询:"+describe.replaceAll("'","''"),eiid);
+                }
+                if(StringUtil.hasText(describe)){
+                    errmsg.append(describe);
+                }
+            }
+            if(isRushRedBill){
+                Map<String,Object> elM = new HashMap<>();
+                elM.put("appKey",m.get("appKey"));
+                elM.put("appSecret",m.get("appSecret"));
+                elM.put("token",m.get("token"));
+                elM.put("taxnum",m.get("taxnum"));
+                elM.put("io_id",ioid);
+                getElecInvoices(elM);
+            }
         }
         }
-        sqls.add("update ELECINVOICE set ei_refno = (case when ei_invoiceLine in ('bs','pc','es','ec') then ei_allElectronicInvoiceNumber else ei_invoiceNumber end) " +
-                "where ei_ioid = "+ioid+" and EI_INVOICESTATE = 1 and EI_EXCEPTIONMESSAGE is null and (ei_allElectronicInvoiceNumber is not null or ei_invoiceNumber is not null )");
-        sqls.add("update invoiceOrder set io_refno = (select (min(ei_refno)||(case when max(ei_refno) <> min(ei_refno) then '-'||max(ei_refno) else '' end)) from ELECINVOICE where ei_ioid = io_id)" +
-                "where io_id = "+ioid);
-        //更新开票记录
-        if(syncToBillOut){
-            sqls.add("update BillOut set bi_refno = (select max(io_refno) from invoiceOrder where io_id = "+ioid+" and io_biid = bi_id) where bi_id in (select io_biid from invoiceOrder where io_id = "+ioid+" and io_refno is not null)");
+        if(errmsg.length()>0){
+            res.put("success", false);
+            res.put("errMsg",errmsg.toString());
+        }else {
+            res.put("success", true);
         }
         }
-        return sqls;
+        return res;
     }
     }
+    //根据红票流水号 获取红票号及其他信息
+    public Map<String,Object> queryRedPdfUrl(List<String> serialNosAll,Map<String,Object> m){
+        Map<String,Object> res = new HashMap<>();
+        String describe = "";
+        try {
+            logger.info("ElecI-queryRedPdfUrl:master {} ,serialNosAll {}",SpObserver.getSp(),serialNosAll.toString());
+            List<String> rSql = new ArrayList<String>();
+            if(serialNosAll.size()>0){
+                Stream.iterate(0, n -> n + 1)
+                        .limit((int) Math.ceil((double) serialNosAll.size() / 50)).forEach(page -> {
+                    List<String> serialNos = serialNosAll.stream().skip(page * 50).limit(50).collect(Collectors.toList());
+                    QueryInvoiceResultReq qirReq = new QueryInvoiceResultReq();
+                    qirReq.setIsOfferInvoiceDetail("0");
+                    qirReq.setSerialNos(serialNos);
+                    QueryInvoiceResultResp qirResp = nuoNuoSDKService.queryInvoiceResult(qirReq,m);
+                    List<QueryInvoiceResultDTO> list = qirResp.getResult();
+                    if(!CollectionUtil.isEmpty(list)){
+                        for (int i = 0; i < list.size(); i++) {
+                            String sql = list.get(i).updatePdfUrlSql();
+                            if(!"".equals(sql)){
+                                rSql.add(sql);
+                            }
+                        }
+                    }
+                });
+            }
+//            System.out.println("rSql:"+rSql.toString());
+            baseDao.execute(rSql);
+        }catch (Exception e){
+            e.printStackTrace();
+            describe = "未知异常";
+            if(StringUtil.hasText(e.getMessage())){
+                describe = e.getMessage();
+            }else if(e.getCause()!=null&&StringUtil.hasText(e.getCause().getMessage())){
+                describe = e.getCause().getMessage();
+            }
+            commonService.logFRecord("查询红票详情",describe.replaceAll("'","''"),0);
+        }
+        return res;
+    }
+
 }
 }

+ 85 - 0
src/main/java/com/uas/eis/service/Impl/NuoNuoSDKServiceImpl.java

@@ -0,0 +1,85 @@
+package com.uas.eis.service.Impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.TypeReference;
+import com.uas.eis.config.DonlimConfig;
+import com.uas.eis.core.config.SpObserver;
+import com.uas.eis.dao.BaseDao;
+import com.uas.eis.dto.*;
+import com.uas.eis.service.CommonService;
+import com.uas.eis.service.NuoNuoSDKService;
+import com.uas.eis.utils.Constant;
+import com.uas.eis.utils.DateUtil;
+import nuonuo.open.sdk.NNOpenSDK;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.UUID;
+
+@Service
+public class NuoNuoSDKServiceImpl implements NuoNuoSDKService {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+    @Autowired
+    private DonlimConfig donlimConfig;
+
+    //nuonuo.OpeMplatform.queryInvoiceRedConfirm(诺税通saas红字确认单查询接口)
+    @Override
+    public QueryInvoiceRedConfirmResp queryInvoiceRedConfirm(QueryInvoiceRedConfirmReq qircReq, Map<String,Object> m) {
+        String url=donlimConfig.getRoute();
+        String taxnum = m.get("taxnum").toString();
+        String appKey = m.get("appKey").toString();
+        String appSecret = m.get("appSecret").toString();
+        String token = m.get("token").toString();
+        NNOpenSDK sdk = NNOpenSDK.getIntance();
+        String method = "nuonuo.OpeMplatform.queryInvoiceRedConfirm"; // API方法名
+        String content = sdk.convertToUtf8(JSONArray.toJSONString(qircReq));
+        logger.info("ElecI-queryInvoiceRedConfirm:master {} content {}", SpObserver.getSp(),content);
+        String senid = UUID.randomUUID().toString().replace("-", ""); // 唯一标识,32位随机码,无需修改,保持默认即可
+        String result = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content);
+//        System.out.println(result);
+        QueryInvoiceRedConfirmResp resp = JSON.parseObject(result, new TypeReference<QueryInvoiceRedConfirmResp>() {});
+        return resp;
+    }
+    //nuonuo.OpeMplatform.queryInvoiceResult(诺税通saas发票详情查询接口)
+    @Override
+    public QueryInvoiceResultResp queryInvoiceResult(QueryInvoiceResultReq qirReq, Map<String,Object> m) {
+        String url=donlimConfig.getRoute();
+        String taxnum = m.get("taxnum").toString();
+        String appKey = m.get("appKey").toString();
+        String appSecret = m.get("appSecret").toString();
+        String token = m.get("token").toString();
+        NNOpenSDK sdk = NNOpenSDK.getIntance();
+        String method = "nuonuo.OpeMplatform.queryInvoiceResult"; // API方法名
+        String content = sdk.convertToUtf8(JSONArray.toJSONString(qirReq));
+        logger.info("ElecI-queryInvoiceResult:master {} content {}",SpObserver.getSp(),content);
+        String senid = UUID.randomUUID().toString().replace("-", ""); // 唯一标识,32位随机码,无需修改,保持默认即可
+        String result = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content);
+//        System.out.println(result);
+        QueryInvoiceResultResp resp = JSON.parseObject(result, new TypeReference<QueryInvoiceResultResp>() {});
+        return resp;
+    }
+    /*
+    * nuonuo.OpeMplatform.findOrderState(诺税通Saas订单状态查询接口)
+    * */
+    @Override
+    public FindOrderRelationInvoiceResp findOrderRelationInvoice(FindOrderRelationInvoiceReq foriReq, Map<String, Object> m) {
+        String url=donlimConfig.getRoute();
+        String taxnum = m.get("taxnum").toString();
+        String appKey = m.get("appKey").toString();
+        String appSecret = m.get("appSecret").toString();
+        String token = m.get("token").toString();
+        NNOpenSDK sdk = NNOpenSDK.getIntance();
+        String method = "nuonuo.OpeMplatform.findOrderRelationInvoice"; // API方法名
+        String content =sdk.convertToUtf8(JSONArray.toJSONString(foriReq));
+        logger.info("ElecI-findOrderRelationInvoice:master {} content {}",SpObserver.getSp(),content);
+        String senid = UUID.randomUUID().toString().replace("-", ""); // 唯一标识,32位随机码,无需修改,保持默认即可
+        String result = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content);
+        FindOrderRelationInvoiceResp resp = JSON.parseObject(result , new TypeReference<FindOrderRelationInvoiceResp>() {});
+        return resp;
+    }
+}

+ 17 - 0
src/main/java/com/uas/eis/service/NuoNuoSDKService.java

@@ -0,0 +1,17 @@
+package com.uas.eis.service;
+
+
+import com.uas.eis.dto.*;
+
+import java.util.Map;
+
+/**
+ * @author wuyx
+ * @email wuyx@usoftchina.com
+ * @date 2023-08-04
+ */
+public interface NuoNuoSDKService {
+    QueryInvoiceRedConfirmResp queryInvoiceRedConfirm(QueryInvoiceRedConfirmReq qircReq, Map<String,Object> m);
+    QueryInvoiceResultResp queryInvoiceResult(QueryInvoiceResultReq qirReq, Map<String,Object> m);
+    FindOrderRelationInvoiceResp findOrderRelationInvoice(FindOrderRelationInvoiceReq foriReq, Map<String,Object> m);
+}

+ 188 - 18
src/main/java/com/uas/eis/task/ElecInvoiceTask.java

@@ -63,11 +63,11 @@ public class ElecInvoiceTask {
      *          {"status":"0000","message":"调用成功","data":[{"sellerTaxNo":"339901999999199","orderNo":"1134068619401396224","rushRedState":"0","invoiceType":1,"invoiceState":1,"invoiceLine":"b","exceptionMessage":"ukey版签章无下载码","sid":"23072713481601034933"}]}
      *          {"status":"0000","message":"调用成功","data":[{"sellerTaxNo":"339901999999199","orderNo":"1134068619401396224","rushRedState":"0","invoiceType":1,"invoiceState":1,"invoiceLine":"b","exceptionMessage":"ukey版签章无下载码","sid":"23072713481601034933"}]}
      * //7:无需开票,此状态可以不用管
      * //7:无需开票,此状态可以不用管
      * */
      * */
-    @Scheduled(cron = "0 0/5 * * * ?")
+    @Scheduled(cron = "0 0/2 * * * ?")
     public void elecInvoiceDownLoad(){
     public void elecInvoiceDownLoad(){
         List<Object[]> obsList=baseDao.getFieldsDatasByCondition("YITOA_DATACENTER.dock_invoice_config",new String[]{"appKey","appSecret","token","taxnum","username"},"1=1");
         List<Object[]> obsList=baseDao.getFieldsDatasByCondition("YITOA_DATACENTER.dock_invoice_config",new String[]{"appKey","appSecret","token","taxnum","username"},"1=1");
         if(!CollectionUtil.isEmpty(obsList)){
         if(!CollectionUtil.isEmpty(obsList)){
-            logger.info("ElecInvoice-DownLoad Begin");
+            logger.info("ElecI-DownLoad Begin");
             for (Object[] obs: obsList) {
             for (Object[] obs: obsList) {
                 if(obs == null){
                 if(obs == null){
                     continue;
                     continue;
@@ -86,37 +86,47 @@ public class ElecInvoiceTask {
                 }else{
                 }else{
                     System.out.println("dev");
                     System.out.println("dev");
                 }
                 }
-                logger.info("ElecInvoice-DownLoad: master: {} Begin ",master);
+                Map<String,Object> m = new HashMap<>();
+                m.put("appKey",appKey);
+                m.put("appSecret",appSecret);
+                m.put("token",token);
+                m.put("taxnum",taxnum);
+                logger.info("ElecI-DownLoad: master: {} Begin ",master);
                 SpObserver.putSp(master);
                 SpObserver.putSp(master);
-                SqlRowList ioList = baseDao.queryForRowSet("select io_id,io_code from(select io_id,io_code from "+master+".invoiceOrder left join "+master+".customer on io_cucode=cu_code " +
-                        " where io_status = '已审核' and nvl(IO_DOCKSTATUS,' ') = '对接成功' and (IO_INVOICESTATUS = 6 or (IO_INVOICESTATUS = 2 and io_refno is null)) order by io_id desc) where rownum <= 100");
-                logger.info("ElecInvoice-DownLoad: master: {} size: {} ",master,ioList.getResultList().size());
+                SqlRowList ioList = baseDao.queryForRowSet("select io_id,io_code from(select io_id,io_code from "+master+".invoiceOrder " +
+                        " where io_status = '已审核' " +
+                        "   and nvl(IO_DOCKSTATUS,' ') = '对接成功' " +
+                        "   and (IO_INVOICESTATUS = 6 or (IO_INVOICESTATUS = 2 and io_refno is null)) " +
+                        //有红票的也要获取
+                        "order by io_id desc) where rownum <= 100");
+                logger.info("ElecI-DownLoad: master: {} size: {} ",master,ioList.getResultList().size());
                 while (ioList.next()){
                 while (ioList.next()){
-                    erpService.getElecInvoices(appKey,appSecret,token,taxnum,ioList.getGeneralInt("io_id"),ioList.getGeneralString("io_code"));
+                    m.put("io_id",ioList.getGeneralInt("io_id"));
+                    m.put("io_code",ioList.getGeneralString("io_code"));
+                    erpService.getElecInvoices(m);
                 }
                 }
-                logger.info("ElecInvoice-DownLoad: master: {} End ",master);
+                logger.info("ElecI-DownLoad: master: {} End ",master);
             }
             }
-            logger.info("ElecInvoice-DownLoad End");
+            logger.info("ElecI-DownLoad End");
         }
         }
     }
     }
-    @Scheduled(cron = "0 0/5 * * * ?")
+    @Scheduled(cron = "0 0/2 * * * ?")
     //PDF文件转存 一次转存
     //PDF文件转存 一次转存
     public void elecInvoiceAttachSave(){
     public void elecInvoiceAttachSave(){
         List<Object[]> obsList=baseDao.getFieldsDatasByCondition("YITOA_DATACENTER.dock_invoice_config",new String[]{"appKey","appSecret","token","taxnum","username"},"1=1");
         List<Object[]> obsList=baseDao.getFieldsDatasByCondition("YITOA_DATACENTER.dock_invoice_config",new String[]{"appKey","appSecret","token","taxnum","username"},"1=1");
         if(!CollectionUtil.isEmpty(obsList)){
         if(!CollectionUtil.isEmpty(obsList)){
-            logger.info("ElecInvoice-AttachSave Begin");
+            logger.info("ElecI-AttachSave Begin");
             for (Object[] obs: obsList) {
             for (Object[] obs: obsList) {
                 if(obs == null){
                 if(obs == null){
                     continue;
                     continue;
                 }
                 }
                 String master = obs[4].toString();
                 String master = obs[4].toString();
-                logger.info("ElecInvoice-AttachSave: master: {} Begin ",master);
+                logger.info("ElecI-AttachSave: master: {} Begin ",master);
                 SpObserver.putSp(master);
                 SpObserver.putSp(master);
                 SqlRowList ioList = baseDao.queryForRowSet("select * from (select ei_id,ei_pdfurl,ei_refno,ei_ioid from ELECINVOICE " +
                 SqlRowList ioList = baseDao.queryForRowSet("select * from (select ei_id,ei_pdfurl,ei_refno,ei_ioid from ELECINVOICE " +
-                        "where ei_pdfurl is not null and ei_pdfattach is null " +
-//                        "and ei_id = 11" +
+                        "where (ei_pdfurl is not null and ei_pdfattach is null) " +
                         " order by ei_id ) where rownum <= 100 ");//一次最多500
                         " order by ei_id ) where rownum <= 100 ");//一次最多500
-                logger.info("ElecInvoice-AttachSave: master: {} size: {} ",master,ioList.getResultList().size());
+                logger.info("ElecI-AttachSave: master: {} size: {} ",master,ioList.getResultList().size());
                 List<Integer> ioids = new ArrayList<>();
                 List<Integer> ioids = new ArrayList<>();
                 while (ioList.next()){
                 while (ioList.next()){
                     //下载地址
                     //下载地址
@@ -165,11 +175,171 @@ public class ElecInvoiceTask {
                     }
                     }
                 }
                 }
                 if(ioids.size()>0){
                 if(ioids.size()>0){
-                    baseDao.execute("update invoiceOrder set io_attach = REPLACE(to_char((select wm_concat(ei_pdfattach) from ELECINVOICE where io_id = ei_ioid)),',','') where io_id in ("+StringUtils.join(ioids.toArray(), ",")+")");
+                    baseDao.execute("update invoiceOrder set io_attach = REPLACE(to_char((select wm_concat(ei_pdfattach) from ELECINVOICE where io_id = ei_ioid and nvl(ei_rushredstate,0) <> 1)),',','') where io_id in ("+StringUtils.join(ioids.toArray(), ",")+")");
                 }
                 }
-                logger.info("ElecInvoice-AttachSave: master: {} End ",master);
+                logger.info("ElecI-AttachSave: master: {} End ",master);
             }
             }
-            logger.info("ElecInvoice-AttachSave End");
+            logger.info("ElecI-AttachSave End");
+        }
+    }
+
+
+    @Scheduled(cron = "0 0/2 * * * ?")
+    //发票红字确认状态查询
+    public void elecInvoiceRedConfirmStateUpdate(){
+        List<Object[]> obsList=baseDao.getFieldsDatasByCondition("YITOA_DATACENTER.dock_invoice_config",new String[]{"appKey","appSecret","token","taxnum","username"},"1=1");
+        if(!CollectionUtil.isEmpty(obsList)){
+            logger.info("ElecI-RedConfirmStateUpdate Begin");
+            for (Object[] obs: obsList) {
+                if(obs == null){
+                    continue;
+                }
+                String master = obs[4].toString();
+                String appKey = donlimConfig.getAppKey();
+                String appSecret = donlimConfig.getAppSecret();
+                String token =  donlimConfig.getToken();
+                String taxnum=  donlimConfig.getTaxnum();
+                if(donlimConfig.isProd()){
+                    System.out.println("prod");
+                    appKey =  obs[0].toString();
+                    appSecret =  obs[1].toString();
+                    token = obs[2].toString();// 访问令牌
+                    taxnum = obs[3].toString();// 授权企业税号
+                }else{
+                    System.out.println("dev");
+                }
+                Map<String,Object> m = new HashMap<>();
+                m.put("appKey",appKey);
+                m.put("appSecret",appSecret);
+                m.put("token",token);
+                m.put("taxnum",taxnum);
+                logger.info("ElecI-RedConfirmStateUpdate: master: {} Begin ",master);
+                SpObserver.putSp(master);
+                SqlRowList ioList = baseDao.queryForRowSet("select * from ( " +
+                        "select io_id,io_Code " +
+                        "from Invoiceorder where exists (Select 1 from ElecInvoice " +
+                        //有红字确认单 但是没有获取到发票号的
+                        "   where ei_ioid = io_id and nvl(EI_INVOICETYPE,'1') = '1' and ei_redapplyid is not null and EI_RELATIVEREFNO is null and nvl(EI_BILLSTATUS,' ') in (' ','02','03') " +
+//                        " and io_code = 'SZ23070006' " +
+                        ")) where rownum <= 100");
+                logger.info("ElecI-DownLoad: master: {} size: {} ",master,ioList.getResultList().size());
+                while (ioList.next()){
+                    m.put("io_id",ioList.getGeneralInt("io_id"));
+                    m.put("io_code",ioList.getGeneralString("io_code"));
+                    m.put("ei_id",0);
+                    erpService.queryInvoiceRedConfirm(m);
+                }
+                logger.info("ElecI-RedConfirmStateUpdate: master: {} End ",master);
+            }
+            logger.info("ElecI-RedConfirmStateUpdate End");
+        }
+    }
+    @Scheduled(cron = "0 0/2 * * * ?")
+    public void redPdfUrlUpdate(){
+        List<Object[]> obsList=baseDao.getFieldsDatasByCondition("YITOA_DATACENTER.dock_invoice_config",new String[]{"appKey","appSecret","token","taxnum","username"},"1=1");
+        if(!CollectionUtil.isEmpty(obsList)){
+            logger.info("ElecI-redPdfUrlUpdate Begin");
+            for (Object[] obs: obsList) {
+                if(obs == null){
+                    continue;
+                }
+                String master = obs[4].toString();
+                String appKey = donlimConfig.getAppKey();
+                String appSecret = donlimConfig.getAppSecret();
+                String token =  donlimConfig.getToken();
+                String taxnum=  donlimConfig.getTaxnum();
+                if(donlimConfig.isProd()){
+                    System.out.println("prod");
+                    appKey =  obs[0].toString();
+                    appSecret =  obs[1].toString();
+                    token = obs[2].toString();// 访问令牌
+                    taxnum = obs[3].toString();// 授权企业税号
+                }else{
+                    System.out.println("dev");
+                }
+                Map<String,Object> m = new HashMap<>();
+                m.put("appKey",appKey);
+                m.put("appSecret",appSecret);
+                m.put("token",token);
+                m.put("taxnum",taxnum);
+                logger.info("ElecI-redPdfUrlUpdate: master: {} Begin ",master);
+                SpObserver.putSp(master);
+                List<String> serialNosAll = baseDao.queryForList("select ei_redsid from ElecInvoice where EI_RELATIVEREFNO is not null and ei_redpdfurl is null and nvl(EI_BILLSTATUS,' ') in ('01','04')",String.class);
+                if (serialNosAll == null){
+                    logger.info("ElecI-redPdfUrlUpdate: master: {} size: {} ",master,0);
+                }else {
+                    logger.info("ElecI-redPdfUrlUpdate: master: {} size: {} ",master,serialNosAll.size());
+                    erpService.queryRedPdfUrl(serialNosAll,m);
+                }
+            }
+            logger.info("ElecI-redPdfUrlUpdate End");
+        }
+    }
+
+    @Scheduled(cron = "0 0/2 * * * ?")
+    //红字PDF文件转存 一次转存
+    public void elecInvoiceRedAttachSave(){
+        List<Object[]> obsList=baseDao.getFieldsDatasByCondition("YITOA_DATACENTER.dock_invoice_config",new String[]{"appKey","appSecret","token","taxnum","username"},"1=1");
+        if(!CollectionUtil.isEmpty(obsList)){
+            logger.info("ElecI-AttachSave Begin");
+            for (Object[] obs: obsList) {
+                if(obs == null){
+                    continue;
+                }
+                String master = obs[4].toString();
+                logger.info("ElecI-AttachSave: master: {} Begin ",master);
+                SpObserver.putSp(master);
+                SqlRowList ioList = baseDao.queryForRowSet("select * from (select ei_id,ei_redpdfurl,ei_relativerefno,ei_ioid from ELECINVOICE " +
+                        "where ei_redpdfurl is not null and ei_redpdfattach is null " +
+                        " order by ei_id ) where rownum <= 100 ");//一次最多500
+                logger.info("ElecI-AttachSave: master: {} size: {} ",master,ioList.getResultList().size());
+                List<Integer> ioids = new ArrayList<>();
+                while (ioList.next()){
+                    //下载地址
+                    String fileUrl = ioList.getGeneralString("ei_redpdfurl"); // "https://inv.jss.com.cn/fp2/2zpnwyKkdvu9dWzE8BhmSnER0Iux3xQRMLidDJhiIE2PziVXY4lL3k83OsK0K06YctW5cf1FFHxraffj-bf16A.pdf";
+                    // 定义要保存的文件的路径
+                    String fileName = ioList.getGeneralString("ei_relativerefno")+".pdf";//发票号码
+                    String fileBasePath = "C:\\invoice\\"+fileName;//发票号码
+                    fileBasePath = "/usr/local/uas/invoice/"+fileName;//发票号码
+                    try {
+                        // 创建URL对象
+                        URL url = new URL(fileUrl);
+                        // 打开连接
+                        URLConnection conn = url.openConnection();
+                        // 获取输入流
+                        InputStream in = conn.getInputStream();
+                        // 创建输出流
+                        FileOutputStream out = new FileOutputStream(fileBasePath);
+                        // 创建缓冲区
+                        byte[] buffer = new byte[104857600];
+                        // 读取并写入数据
+                        int len;
+                        while ((len = in.read(buffer)) != -1) {
+                            out.write(buffer, 0, len);
+                        }
+                        long size = out.getChannel().size();
+                        // 关闭流
+                        in.close();
+                        out.close();
+//                        System.out.println("size:"+size);
+                        //存文件 filepath
+                        int id = commonService.saveFilePath(fileBasePath, (int) size, fileName, "管理员");
+                        baseDao.execute("update ELECINVOICE set ei_redpdfattach ='"+id+";' where ei_id = "+ioList.getGeneralInt("ei_id"));
+                        System.out.println("下载成功");
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                        String errMsg = "文件转存异常";
+                        if(StringUtil.hasText(e.getMessage())){
+                            errMsg = e.getMessage();
+                        }else if(e.getCause()!=null&&StringUtil.hasText(e.getCause().getMessage())){
+                            errMsg = e.getCause().getMessage();
+                        }
+                        commonService.logFRecord("订单关联发票对接",errMsg.replaceAll("'","''"),ioList.getGeneralInt("ei_id"));
+                    }
+                }
+                logger.info("ElecI-AttachSave: master: {} End ",master);
+            }
+            logger.info("ElecI-AttachSave End");
         }
         }
     }
     }
 }
 }

+ 1 - 1
src/main/java/com/uas/eis/task/InvoiceOrderTask.java

@@ -30,7 +30,7 @@ public class InvoiceOrderTask {
      *      //6:部分待处理 表示订单部分转了开票申请,此状态需要定时获取
      *      //6:部分待处理 表示订单部分转了开票申请,此状态需要定时获取
      * 		//7:无需开票,此状态可以不用管,此状态需要定时获取
      * 		//7:无需开票,此状态可以不用管,此状态需要定时获取
      * */
      * */
-    @Scheduled(cron = "0 0/5 * * * ?")
+    @Scheduled(cron = "0 0/2 * * * ?")
     public void InvoiceOrderStateUpdate(){
     public void InvoiceOrderStateUpdate(){
         List<Object[]> obsList=baseDao.getFieldsDatasByCondition("YITOA_DATACENTER.dock_invoice_config",new String[]{"appKey","appSecret","token","taxnum","username"},"1=1");
         List<Object[]> obsList=baseDao.getFieldsDatasByCondition("YITOA_DATACENTER.dock_invoice_config",new String[]{"appKey","appSecret","token","taxnum","username"},"1=1");
         if(!CollectionUtil.isEmpty(obsList)){
         if(!CollectionUtil.isEmpty(obsList)){

+ 38 - 5
src/test/java/com/uas/eis/UasEisApplicationTests.java

@@ -139,7 +139,7 @@ public class UasEisApplicationTests {
 		reqParam.put("needInvoiceSourceDetail","0");// 是否需要发票所来源的订单明细,1-是, 0-否(不填默认 0) 当为0时,将不回传orderDetailCallBackVOS
 		reqParam.put("needInvoiceSourceDetail","0");// 是否需要发票所来源的订单明细,1-是, 0-否(不填默认 0) 当为0时,将不回传orderDetailCallBackVOS
 		//SZ23070026
 		//SZ23070026
 		//betaRTC-202105-003180-209
 		//betaRTC-202105-003180-209
-		reqParam.put("originalOrderNo","SZ23070018");//部分待处理-没开票 {"status":"8958","message":"该订单对应的开票单不存在","data":null}
+		reqParam.put("originalOrderNo","SZ23070042");//部分待处理-没开票 {"status":"8958","message":"该订单对应的开票单不存在","data":null}
 		reqParam.put("saleTaxNum","339901999999199");
 		reqParam.put("saleTaxNum","339901999999199");
 		// invoiceState = 1 开票状态,合并冲销时为空 1:开票成功 2:开票失败
 		// invoiceState = 1 开票状态,合并冲销时为空 1:开票成功 2:开票失败
 		//exceptionMessage 开票异常信息,开票失败状态时返回
 		//exceptionMessage 开票异常信息,开票失败状态时返回
@@ -153,7 +153,8 @@ public class UasEisApplicationTests {
 
 
 	@Test
 	@Test
 	public void TestDownLoadElecInvoice(){
 	public void TestDownLoadElecInvoice(){
-		Map<String, Object> m = erpService.getElecInvoicesById("N_HUASL_SZ", 47);
+//		20230731182154174492 SZ23070033
+		Map<String, Object> m = erpService.getElecInvoicesById("N_HUASL_SZ", 7);
 		System.out.println(JSONObject.toJSONString(m));
 		System.out.println(JSONObject.toJSONString(m));
 //		elecInvoiceTask.elecInvoiceDownLoad();
 //		elecInvoiceTask.elecInvoiceDownLoad();
 	}
 	}
@@ -196,10 +197,10 @@ public class UasEisApplicationTests {
 	public void TestElecInvoiceAttachSave(){
 	public void TestElecInvoiceAttachSave(){
 		elecInvoiceTask.elecInvoiceAttachSave();
 		elecInvoiceTask.elecInvoiceAttachSave();
 	}
 	}
-
+	//冲红
 	@Test
 	@Test
 	public void testRushRed(){
 	public void testRushRed(){
-		erpService.rushRed("N_HUASL_SZ",47);
+		erpService.rushRed("N_HUASL_SZ",7);
 	}
 	}
 
 
 	@Test
 	@Test
@@ -209,6 +210,38 @@ public class UasEisApplicationTests {
 		String appSecret = donlimConfig.getAppSecret();
 		String appSecret = donlimConfig.getAppSecret();
 		String token =  donlimConfig.getToken();
 		String token =  donlimConfig.getToken();
 		String taxnum=  donlimConfig.getTaxnum();
 		String taxnum=  donlimConfig.getTaxnum();
-		erpService.queryInvoiceRedConfirm( taxnum,  appKey,  appSecret,  token, url,"1135624457459470336");
+//		erpService.queryInvoiceRedConfirmByCode( taxnum,  appKey,  appSecret,  token, url,"1135624457459470336");
+	}
+
+	@Test
+	public void testRed(){
+		NNOpenSDK sdk = NNOpenSDK.getIntance();
+		String taxnum ="339901999999199";////测试
+		String appKey = "78607195";
+		String appSecret = "26A860C451744A21";
+		String token = "77f21f617f87135fcd97ef1ueud3dxdi";
+		String url = "https://sdk.nuonuo.com/open/v1/services";//SDK请求地址
+		String method = "nuonuo.OpeMplatform.queryInvoiceResult"; // API方法名
+		String content = "{" +
+//				"\"serialNos\": \"23073118215402725192\""+//流水号 -- EI_SID -- invoiceSerialNum
+  				",\"orderNos\": \"20230731182154174492\""+ //开票单号 --- EI_ORDERNO -- ORDERNO
+  				",\"isOfferInvoiceDetail\": \"0\""+
+//				",\"extensionNumber\": \"-\","+
+//				"\"deptId\": \"-\","+
+//				"\"clerkId\": \"-\","+
+//				"\"startTime\": \"2022-05-19\","+
+//				"\"endTime\": \"2022-06-19\""+
+				"}";
+	String senid = UUID.randomUUID().toString().replace("-", ""); // 唯一标识,32位随机码,无需修改,保持默认即可
+	String result = sdk.sendPostSyncRequest(url, senid, appKey, appSecret, token, taxnum, method, content);
+		System.out.println(result);
+	}
+	@Test
+	public void TestelecInvoiceRedConfirmStateUpdate(){
+		elecInvoiceTask.elecInvoiceRedConfirmStateUpdate();
+	}
+	@Test
+	public void TestElecInvoiceRedAttachSave(){
+		elecInvoiceTask.elecInvoiceRedAttachSave();
 	}
 	}
 }
 }