package tinvoicebill; import baseclass.PaoCust; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import openapi.base.data.Row; import openapi.base.data.Rows; import openapi.base.data.db.DBConnect; import openapi.tools.Math; import openapi.tools.nuonuo.OpenApi; import org.apache.commons.codec.binary.Base64; import p2.application.doclink.Doclinks; import p2.p2server.P2Server; import p2.pao.PaoRemote; import p2.pao.PaoSet; import p2.pao.PaoSetRemote; import p2.util.P2AppException; import p2.util.P2Exception; import p2.webclient.system.controller.UploadFile; import p2.webclient.system.controller.UploadFileOSS; import p2.webclient.system.controller.Utility; import tinvoiceapply.tinvoiceapply; import tinvoicebillitem.tinvoicebillitem; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.security.KeyFactory; import java.security.PublicKey; import java.security.spec.X509EncodedKeySpec; import java.util.Calendar; import java.util.Iterator; import java.util.Properties; public class tinvoicebill extends PaoCust { public tinvoicebill(PaoSet arg0) { super(arg0); } @Override public void init() throws P2Exception { super.init(); if (!toBeAdded()) { if (getOwner() instanceof tinvoiceapply && "审核".equals(getOwner().getString("fstatus"))) { if ("2".equals(getString("status"))) { setFieldFlag(new String[]{"fnotes", "billInfoNo"}, READONLY, true); } } } } @Override public void add() throws P2Exception { super.add(); if (getOwner() instanceof tinvoiceapply) { setValue("tinvoiceapplyid", getOwner().getUniqueIDValue(), 11L); } } @Override public void canDelete() throws P2Exception { super.canDelete(); if (getOwner() instanceof tinvoiceapply && "审核".equals(getOwner().getString("fstatus"))) { if ("蓝".equals(getString("frb"))) { throw new P2AppException("", "审核状态下蓝票不可删除"); } if ("2".equals(getString("status"))) { throw new P2AppException("", "已完成开票,不可删除"); } } } @Override public void delete(long l) throws P2Exception { super.delete(l); } public void addbillitemnos(PaoSetRemote tinvoicebillitem_view) throws P2Exception { PaoSetRemote tinvoicebillitemSet = getPaoSet("tinvoicebillitem"); Iterator it = tinvoicebillitem_view.getSelection().iterator(); while (it.hasNext()) { PaoRemote tinvoiceapplyorder = it.next(); PaoRemote tinvoicebillitem = tinvoicebillitemSet.addAtEnd(); tinvoicebillitem.setValue("tinvoiceapplyordid", tinvoiceapplyorder.getLong("tinvoiceapplyordid")); tinvoicebillitem.setValue("goodscode", tinvoiceapplyorder.getString("fitemno")); tinvoicebillitem.setValue("goodsname", tinvoiceapplyorder.getString("fitemname")); tinvoicebillitem.setValue("spectype", tinvoiceapplyorder.getString("fspec")); tinvoicebillitem.setValue("unit", tinvoiceapplyorder.getString("funit")); tinvoicebillitem.setValue("num", tinvoiceapplyorder.getDouble("finvoiceqty"), 11L); tinvoicebillitem.setValue("price", tinvoiceapplyorder.getDouble("fprice"), 11L); tinvoicebillitem.setValue("taxincludedamount", tinvoiceapplyorder.getDouble("finvoiceamount"), 11L); } } /** * 发票查询 * * @return */ public void queryInvoice() throws P2Exception { if (getString("status").equals("2") && "红".equals(getString("frb"))) { return; } String finvoiceserialnum = getString("finvoiceserialnum");//发票流水号 JSONObject contentObject = new JSONObject(); contentObject.put("isOfferInvoiceDetail", "1"); JSONArray serialNosArray = new JSONArray(); serialNosArray.add(finvoiceserialnum); contentObject.put("serialNos", serialNosArray); JSONObject object = new OpenApi().requestApi("nuonuo.ElectronInvoice.queryInvoiceResult", contentObject.toString()); if (object.getString("code").equalsIgnoreCase("E0000")) { JSONArray resultArray = object.getJSONArray("result"); for (Object o : resultArray) { JSONObject resultObject = (JSONObject) o; String status = resultObject.getString("status"); String statusMsg = resultObject.getString("statusMsg"); setValue("status", status, 11L); setValue("msg", statusMsg, 11L); if (status.equals("2")) { if (resultObject.containsKey("pdfUrl")) { String pdfUrl = resultObject.getString("pdfUrl"); if (getString("pdfUrl").equals("")) { upLoadDocUrl(pdfUrl, "发票pdf地址"); } setValue("pdfUrl", pdfUrl, 11L); } if (resultObject.containsKey("paperPdfUrl")) { String paperPdfUrl = resultObject.getString("paperPdfUrl"); if (getString("paperPdfUrl").equals("")) { upLoadDocUrl(paperPdfUrl, "纸票pdf地址"); } setValue("paperPdfUrl", paperPdfUrl, 11L); } if (resultObject.containsKey("invoiceCode")) { String invoiceCode = resultObject.getString("invoiceCode"); setValue("invoiceCode", invoiceCode, 11L); } if (resultObject.containsKey("invoiceNo")) { String invoiceNo = resultObject.getString("invoiceNo"); setValue("invoiceNo", invoiceNo, 11L); } createPrintStr(getString("invoiceCode"), getString("invoiceNo"), Double.parseDouble(resultObject.getString("orderAmount"))); if ("红".equals(getString("frb"))) { //红票查询成功后,更新订单已开票数量 DBConnect dbConnect = new DBConnect(); Rows rows = dbConnect.runSqlQuery("select t3.saorderdetailid,sum(t2.taxincludedamount)as taxincludedamount from tinvoicebill t1\n" + "inner join tinvoicebillitem t2 on t1.siteid=t2.siteid and t1.tinvoiceapplyid=t2.tinvoiceapplyid and t1.tinvoicebillid=t2.tinvoicebillid\n" + "inner join tinvoiceapplyorder t3 on t2.siteid=t3.siteid and t2.tinvoiceapplyid=t3.tinvoiceapplyid and t2.tinvoiceapplyordid=t3.tinvoiceapplyordid\n" + "where t1.tinvoicebillid='" + getUniqueIDValue() + "' group by t3.saorderdetailid"); PaoSetRemote saorderdetailSet = getPaoSet("$saorderdetail", "saorderdetail", "siteid='" + getString("siteid") + "' and saorderdetailid in " + rows.getInWhere("saorderdetailid")); int i = 0; while (saorderdetailSet.getPao(i) != null) { for (Row row : rows) { if (String.valueOf(saorderdetailSet.getPao(i).getUniqueIDValue()).equalsIgnoreCase(row.getString("saorderdetailid"))) { double foldinvoiceamount = saorderdetailSet.getPao(i).getDouble("finvoiceamount"); saorderdetailSet.getPao(i).setValue("finvoiceamount", Math.add(foldinvoiceamount, row.getDouble("taxincludedamount")), 11L); double sainvoiceamount = -row.getDouble("taxincludedamount"); /** * 更新发货单已开票金额 */ PaoSetRemote sainvoicedetailSet = saorderdetailSet.getPao(i).getPaoSet("sainvoicedetail"); sainvoicedetailSet.setOrderBy("sainvoicedetailid"); int n = 0; while (sainvoicedetailSet.getPao(n) != null) { if (sainvoicedetailSet.getPao(n).getPaoSet("SAINVOICE").getPao(0).getString("").equals("关闭")) { double finvoiceamount_sainvoice = sainvoicedetailSet.getPao(n).getDouble("famount");//发货单已开票金额 if (finvoiceamount_sainvoice > 0) {//表示已开票 double fneedinvoiceamount_sainvoice = finvoiceamount_sainvoice;//发货单应减开票金额 if (fneedinvoiceamount_sainvoice > sainvoiceamount) { fneedinvoiceamount_sainvoice = sainvoiceamount; } sainvoicedetailSet.getPao(n).setValue("finvoiceamount", baseclass.tools.Math.sub(finvoiceamount_sainvoice, fneedinvoiceamount_sainvoice), 11L); sainvoiceamount = baseclass.tools.Math.sub(sainvoiceamount, fneedinvoiceamount_sainvoice); } } n++; } } } i++; } } } } } setValue("result", object.toString(), 11L); } /** * 根据蓝票生成红票 * * @throws P2Exception */ public long addRedBill() throws P2Exception { PaoSetRemote tinvoicebillitemSet = getPaoSet("tinvoicebillitem"); PaoRemote redBill = getThisPaoSet().addAtEnd(); redBill.setValue("tinvoiceapplyid", getLong("tinvoiceapplyid"), 11L); redBill.setValue("frb", "红", 11L); redBill.setValue("fblueinvoiceid", getUniqueIDValue(), 11L);//蓝票ID PaoSetRemote redBillItemset = redBill.getPaoSet("tinvoicebillitem"); tinvoicebillitemSet.copy(redBillItemset); int i = 0; while (redBillItemset.getPao(i) != null) { redBillItemset.getPao(i).setValue("tinvoicebillid", redBill.getUniqueIDValue(), 11L); redBillItemset.getPao(i).setValue("num", -redBillItemset.getPao(i).getDouble("num"), 11L); redBillItemset.getPao(i).setValue("taxincludedamount", -redBillItemset.getPao(i).getDouble("taxincludedamount"), 11L); i++; } return redBill.getUniqueIDValue(); } public void createBlueInvoice() throws P2Exception { JSONObject contentObject = new JSONObject(); JSONObject orderObject = new JSONObject(); /** * 购方信息 */ PaoSetRemote tinvoiceapplySet = getPaoSet("tinvoiceapply"); if (tinvoiceapplySet.isEmpty()) { throw new P2AppException("", "数据异常"); } PaoRemote tinvoiceapply = tinvoiceapplySet.getPao(0); orderObject.put("buyerName", tinvoiceapply.getString("finvoicename"));//购方名称 orderObject.put("buyerTaxNum", tinvoiceapply.getString("finvoicetaxnumber"));//购方税号(企业要填,个人可为空) orderObject.put("buyerTel", tinvoiceapply.getString("finvoicemobile"));//购方电话 orderObject.put("buyerAddress", tinvoiceapply.getString("finvoiceaddress"));//购方地址 orderObject.put("buyerAccount", tinvoiceapply.getString("finvoicebankandaccount"));//购方银行账号及开户行地址 /** * 销方信息 */ orderObject.put("salerTaxNum", OpenApi.taxnum);//销方税号(使用沙箱环境请求时消息体参数salerTaxNum和消息头参数userTax填写339901999999142) orderObject.put("salerTel", "0573-89053728");//销方电话 orderObject.put("salerAddress", "浙江省嘉兴市海盐县经济开发区棕榈路555号1#厂房");//销方地址 orderObject.put("salerAccount", "中国银行股份有限公司海盐大桥新区支行370159618166");//销方银行账号和开户行地址 orderObject.put("orderNo", String.valueOf(getUniqueIDValue()));//订单号(每个企业唯一) orderObject.put("invoiceDate", getDateTime_Str());//订单时间 //orderObject.put("invoiceCode", "");//冲红时填写的对应蓝票发票代码(红票必填 10位或12 位, 11位的时候请左补 0) //orderObject.put("invoiceNum", "");//冲红时填写的对应蓝票发票号码(红票必填,不满8位请左补0) //orderObject.put("billInfoNo", "");//红字信息表编号.专票冲红时此项必填,且必须在备注中注明“开具红字增值税专用发票信息表编号ZZZZZZZZZZZZZZZZ”字样,其 中“Z”为开具红字增值税专用发票所需要的长度为16位信息表编号。 //orderObject.put("departmentId", "");//部门门店id(诺诺系统中的id) //orderObject.put("clerkId", "");//开票员id(诺诺系统中的id) DBConnect dbConnect = new DBConnect(); Rows rows = dbConnect.runSqlQuery("select fsonum = (stuff((select ',' + fsonum from (select distinct t3.fsonum from tinvoicebillitem t1\n" + "inner join tinvoiceapplyorder t2 on t1.siteid=t2.siteid and t1.tinvoiceapplyid=t2.tinvoiceapplyid and t1.tinvoiceapplyordid=t2.tinvoiceapplyordid\n" + "inner join saorder t3 on t2.siteid=t3.siteid and t2.saorderid=t3.saorderid \n" + "where t1.tinvoicebillid='" + getUniqueIDValue() + "' \n" + ")t for xml path('')),1,1,''))"); String fnotes = getString("fnotes"); String fsonum = rows.get(0).getString("fsonum"); orderObject.put("remark", rows.isEmpty() ? fnotes : (fnotes.equals("") ? fsonum : (fnotes + ";" + fsonum)));//冲红时,在备注中注明“对应正数发票代码:XXXXXXXXX号码:YYYYYYYY”文案,其中“X”为发票代码,“Y”为发票号码,可以不填,接口会自动添加该文案;机动车发票蓝票时备注只能为空 orderObject.put("checker", tinvoiceapply.getString("finvoicechecker"));//复核人 orderObject.put("payee", tinvoiceapply.getString("finvoicepayee"));//收款人 orderObject.put("clerk", tinvoiceapply.getString("finvoiceclerk"));//开票员 //orderObject.put("listFlag", "0");//清单标志:非清单:0;清单:1,默认:0 //orderObject.put("listName", "");//清单项目名称:对应发票票面项目名称(listFlag为1时,必填,默认为“详见销货清 单”) /** * 消息推送设置 */ String fphonenumber = tinvoiceapply.getString("fphonenumber"); String femail = tinvoiceapply.getString("femail"); String pushMode = "-1"; if (!femail.equals("")) { if (!fphonenumber.equals("")) { pushMode = "2"; } else { pushMode = "0"; } } else { if (!fphonenumber.equals("")) { pushMode = "1"; } } orderObject.put("pushMode", pushMode);//推送方式:-1,不推送;0,邮箱;1,手机(默认);2,邮箱、手机 orderObject.put("buyerPhone", fphonenumber);//购方手机(pushMode为1或2时,此项为必填) orderObject.put("email", femail);//推送邮箱(pushMode为0或2时,此项为必填) orderObject.put("invoiceType", "1");//开票类型:1:蓝票;2:红票 orderObject.put("invoiceLine", tinvoiceapply.getString("finvoiceline"));//发票种类:p,普通发票(电票)(默认);c,普通发票(纸票);s,专用发票;e,收购发票(电票);f,收购发票(纸质);r,普通发票(卷式);b,增值税 电子专用发票;j,机动车销售统一发票 //orderObject.put("productOilFlag", "");//成品油标志:非成品油(默认):0;成品油:1 //orderObject.put("proxyInvoiceFlag", "");//代开标志:0非代开;1代开。代开蓝票时备注要求填写文案:代开企业税号:***,代开企业名称:***;代开红票时备注要求填写文案:对应正数发票代码:***号码:***代开企业税号:***代开企业名称:*** //orderObject.put("callBackUrl", "");//开票完成回传发票信息地址 //orderObject.put("extensionNumber", "");//分机号(只能为空或者数字) //orderObject.put("terminalNumber", "");//终端号(开票终端号,只能 为空或数字) //orderObject.put("machineCode", "");//机器编号 //orderObject.put("vehicleFlag", "");//是否机动车类专票 0-否 1-是 JSONArray invoiceDetailArray = new JSONArray(); PaoSetRemote tinvoicebillitemSet = getPaoSet("tinvoicebillitem"); int i = 0; while (tinvoicebillitemSet.getPao(i) != null) { tinvoicebillitem tinvoicebillitem = (tinvoicebillitem) tinvoicebillitemSet.getPao(i); JSONObject invoiceDetailObject = new JSONObject(); invoiceDetailObject.put("goodsName", tinvoicebillitem.getString("goodsname"));//商品名称(如invoiceLineProperty =1,则此商品行为折扣行,折扣行不允许多行折扣,折扣行必须紧邻被折扣行,商品名称必须与被折扣行一致) //invoiceDetailObject.put("goodsCode", "12312312312");//商品编码(商品税收分类编码开发者自行 填写) //invoiceDetailObject.put("selfCode", "");//自行编码(可不填) invoiceDetailObject.put("withTaxFlag", "1");//单价含税标志:0:不含税,1:含税 invoiceDetailObject.put("price", String.valueOf(tinvoicebillitem.getDouble("price")));//单价,当单价(price)为空时,数量(num)也必须为空;(price)为空时,含税金额(ta xIncludedAmount)、不含税金额(taxEx cludedAmount)、税额(tax)都不能为空 invoiceDetailObject.put("num", String.valueOf(tinvoicebillitem.getDouble("num")));//数量(开具红票时数量为负数) invoiceDetailObject.put("unit", String.valueOf(tinvoicebillitem.getString("unit")));//单位 invoiceDetailObject.put("specType", String.valueOf(tinvoicebillitem.getString("spectype")));//规格型号 //invoiceDetailObject.put("tax", "");//税额,[不含税金额] * [税率] = [税额];税额允许误差为 0.06。红票为负。不含税金额、税额、含税金额任何一个不传时,会 根据传入的单价,数量进行计算,可能和 实际数值存在误差,建议都传入 invoiceDetailObject.put("taxRate", String.valueOf(tinvoicebillitem.getDouble("taxrate")));//税率,注:纸票清单红票存在为null的情况 //invoiceDetailObject.put("taxExcludedAmount", "");//不含税金额。红票为负。不含税金额、税额、含税金额任何一个不传时,会根据传 入的单价,数量进行计算,可能和实际数 值存在误差,建议都传入 //invoiceDetailObject.put("taxIncludedAmount", "");//含税金额,[不含税金额] + [税额] = [含税金额],红票为负。不含税金额、税额、含税金额任何一个不传时,会根据传入的单 价,数量进行计算,可能和实际数值存在 误差,建议都传入 //invoiceDetailObject.put("invoiceLineProperty", "");//发票行性质:0,正常行;1,折扣行;2,被折扣行 //invoiceDetailObject.put("favouredPolicyFlag", "");//优惠政策标识:0,不使用;1,使用 //invoiceDetailObject.put("favouredPolicyName", "");//增值税特殊管理(优惠政策名称),当favouredPolicyFlag为1时,此项必填 //invoiceDetailObject.put("deduction", "");//扣除额,差额征收时填写,目前只支持填写一项。 注意:当传0、空或字段不传时,都表示非差额征税;传0.00才表示差额 征税:0.00 //invoiceDetailObject.put("zeroRateFlag", "");//零税率标识:空,非零税率;1,免税;2,不征税;3,普通零税率;1、当税率为:0%,且增 值税特殊管理:为“免税”, 零税率标识:需传“1” 2、当税率为:0%,且增值 税特殊管理:为"不征税" 零税率标识:需 传“2” 3、当税率为:0%,且增值税特 殊管理:为空 零税率标识:需传“3” invoiceDetailArray.add(invoiceDetailObject); i++; } orderObject.put("invoiceDetail", invoiceDetailArray); contentObject.put("order", orderObject); JSONObject result = new OpenApi().requestApi("nuonuo.ElectronInvoice.requestBillingNew", contentObject.toString()); if (result.containsKey("code") && result.getString("code").equalsIgnoreCase("E0000")) { String invoiceSerialNum = result.getJSONObject("result").getString("invoiceSerialNum"); setValue("finvoiceserialnum", invoiceSerialNum, 11L); } if (result.containsKey("describe")) { String describe = result.getString("describe"); setValue("msg", describe, 11L); } } public void createRedInvoice() throws P2Exception { PaoSetRemote tinvoicebill_blueSet = getPaoSet("tinvoicebill_blue"); if (tinvoicebill_blueSet.isEmpty()) { throw new P2AppException("", "找不到对应到蓝票信息"); } JSONObject contentObject = new JSONObject(); JSONObject orderObject = new JSONObject(); /** * 购方信息 */ PaoSetRemote tinvoiceapplySet = getPaoSet("tinvoiceapply"); if (tinvoiceapplySet.isEmpty()) { throw new P2AppException("", "数据异常"); } PaoRemote tinvoiceapply = tinvoiceapplySet.getPao(0); orderObject.put("buyerName", tinvoiceapply.getString("finvoicename"));//购方名称 orderObject.put("buyerTaxNum", tinvoiceapply.getString("finvoicetaxnumber"));//购方税号(企业要填,个人可为空) orderObject.put("buyerTel", tinvoiceapply.getString("finvoicemobile"));//购方电话 orderObject.put("buyerAddress", tinvoiceapply.getString("finvoiceaddress"));//购方地址 orderObject.put("buyerAccount", tinvoiceapply.getString("finvoicebankandaccount"));//购方银行账号及开户行地址 /** * 销方信息 */ orderObject.put("salerTaxNum", OpenApi.taxnum);//销方税号(使用沙箱环境请求时消息体参数salerTaxNum和消息头参数userTax填写339901999999142) orderObject.put("salerTel", "0573-89053728");//销方电话 orderObject.put("salerAddress", "浙江省嘉兴市海盐县经济开发区棕榈路555号1#厂房");//销方地址 orderObject.put("salerAccount", "中国银行股份有限公司海盐大桥新区支行370159618166");//销方银行账号和开户行地址 orderObject.put("orderNo", String.valueOf(getUniqueIDValue()));//订单号(每个企业唯一) orderObject.put("invoiceDate", getDateTime_Str());//订单时间 PaoRemote tinvoicebill_blue = tinvoicebill_blueSet.getPao(0); String invoicecode = tinvoicebill_blue.getString("invoicecode"); if (invoicecode.length() == 11) { invoicecode = "0" + invoicecode; } orderObject.put("invoiceCode", invoicecode);//冲红时填写的对应蓝票发票代码(红票必填 10位或12 位, 11位的时候请左补 0) orderObject.put("invoiceNum", createstr(8, tinvoicebill_blue.getString("invoiceNo")));//冲红时填写的对应蓝票发票号码(红票必填,不满8位请左补0) DBConnect dbConnect = new DBConnect(); if (tinvoiceapply.getString("finvoiceline").equals("s") || tinvoiceapply.getString("finvoiceline").equals("b")) { orderObject.put("billInfoNo", getString("billInfoNo"));//红字信息表编号.专票冲红时此项必填,且必须在备注中注明“开具红字增值税专用发票信息表编号ZZZZZZZZZZZZZZZZ”字样,其 中“Z”为开具红字增值税专用发票所需要的长度为16位信息表编号。 orderObject.put("remark", "开具红字增值税专用发票信息表编号" + getString("billInfoNo"));//冲红时,在备注中注明“对应正数发票代码:XXXXXXXXX号码:YYYYYYYY”文案,其中“X”为发票代码,“Y”为发票号码,可以不填,接口会自动添加该文案;机动车发票蓝票时备注只能为空 } //orderObject.put("departmentId", "");//部门门店id(诺诺系统中的id) //orderObject.put("clerkId", "");//开票员id(诺诺系统中的id) //tinvoicebillitem orderObject.put("checker", tinvoiceapply.getString("finvoicechecker"));//复核人 orderObject.put("payee", tinvoiceapply.getString("finvoicepayee"));//收款人 orderObject.put("clerk", tinvoiceapply.getString("finvoiceclerk"));//开票员 //orderObject.put("listFlag", "0");//清单标志:非清单:0;清单:1,默认:0 //orderObject.put("listName", "");//清单项目名称:对应发票票面项目名称(listFlag为1时,必填,默认为“详见销货清 单”) /** * 消息推送设置 */ String fphonenumber = tinvoiceapply.getString("fphonenumber"); String femail = tinvoiceapply.getString("femail"); String pushMode = "-1"; if (!femail.equals("")) { if (!fphonenumber.equals("")) { pushMode = "2"; } else { pushMode = "0"; } } else { if (!fphonenumber.equals("")) { pushMode = "1"; } } orderObject.put("pushMode", pushMode);//推送方式:-1,不推送;0,邮箱;1,手机(默认);2,邮箱、手机 orderObject.put("buyerPhone", fphonenumber);//购方手机(pushMode为1或2时,此项为必填) orderObject.put("email", femail);//推送邮箱(pushMode为0或2时,此项为必填) orderObject.put("invoiceType", "2");//开票类型:1:蓝票;2:红票 orderObject.put("invoiceLine", tinvoiceapply.getString("finvoiceline"));//发票种类:p,普通发票(电票)(默认);c,普通发票(纸票);s,专用发票;e,收购发票(电票);f,收购发票(纸质);r,普通发票(卷式);b,增值税 电子专用发票;j,机动车销售统一发票 //orderObject.put("productOilFlag", "");//成品油标志:非成品油(默认):0;成品油:1 //orderObject.put("proxyInvoiceFlag", "");//代开标志:0非代开;1代开。代开蓝票时备注要求填写文案:代开企业税号:***,代开企业名称:***;代开红票时备注要求填写文案:对应正数发票代码:***号码:***代开企业税号:***代开企业名称:*** //orderObject.put("callBackUrl", "");//开票完成回传发票信息地址 //orderObject.put("extensionNumber", "");//分机号(只能为空或者数字) //orderObject.put("terminalNumber", "");//终端号(开票终端号,只能 为空或数字) //orderObject.put("machineCode", "");//机器编号 //orderObject.put("vehicleFlag", "");//是否机动车类专票 0-否 1-是 JSONArray invoiceDetailArray = new JSONArray(); PaoSetRemote tinvoicebillitemSet = getPaoSet("tinvoicebillitem"); int i = 0; while (tinvoicebillitemSet.getPao(i) != null) { tinvoicebillitem tinvoicebillitem = (tinvoicebillitem) tinvoicebillitemSet.getPao(i); JSONObject invoiceDetailObject = new JSONObject(); invoiceDetailObject.put("goodsName", tinvoicebillitem.getString("goodsname"));//商品名称(如invoiceLineProperty =1,则此商品行为折扣行,折扣行不允许多行折扣,折扣行必须紧邻被折扣行,商品名称必须与被折扣行一致) //invoiceDetailObject.put("goodsCode", "12312312312");//商品编码(商品税收分类编码开发者自行 填写) //invoiceDetailObject.put("selfCode", "");//自行编码(可不填) invoiceDetailObject.put("withTaxFlag", "1");//单价含税标志:0:不含税,1:含税 invoiceDetailObject.put("price", String.valueOf(tinvoicebillitem.getDouble("price")));//单价,当单价(price)为空时,数量(num)也必须为空;(price)为空时,含税金额(ta xIncludedAmount)、不含税金额(taxEx cludedAmount)、税额(tax)都不能为空 invoiceDetailObject.put("num", String.valueOf(tinvoicebillitem.getDouble("num")));//数量(开具红票时数量为负数) invoiceDetailObject.put("unit", String.valueOf(tinvoicebillitem.getString("unit")));//单位 invoiceDetailObject.put("specType", String.valueOf(tinvoicebillitem.getString("spectype")));//规格型号 //invoiceDetailObject.put("tax", "");//税额,[不含税金额] * [税率] = [税额];税额允许误差为 0.06。红票为负。不含税金额、税额、含税金额任何一个不传时,会 根据传入的单价,数量进行计算,可能和 实际数值存在误差,建议都传入 invoiceDetailObject.put("taxRate", String.valueOf(tinvoicebillitem.getDouble("taxrate")));//税率,注:纸票清单红票存在为null的情况 //invoiceDetailObject.put("taxExcludedAmount", "");//不含税金额。红票为负。不含税金额、税额、含税金额任何一个不传时,会根据传 入的单价,数量进行计算,可能和实际数 值存在误差,建议都传入 //invoiceDetailObject.put("taxIncludedAmount", "");//含税金额,[不含税金额] + [税额] = [含税金额],红票为负。不含税金额、税额、含税金额任何一个不传时,会根据传入的单 价,数量进行计算,可能和实际数值存在 误差,建议都传入 //invoiceDetailObject.put("invoiceLineProperty", "");//发票行性质:0,正常行;1,折扣行;2,被折扣行 //invoiceDetailObject.put("favouredPolicyFlag", "");//优惠政策标识:0,不使用;1,使用 //invoiceDetailObject.put("favouredPolicyName", "");//增值税特殊管理(优惠政策名称),当favouredPolicyFlag为1时,此项必填 //invoiceDetailObject.put("deduction", "");//扣除额,差额征收时填写,目前只支持填写一项。 注意:当传0、空或字段不传时,都表示非差额征税;传0.00才表示差额 征税:0.00 //invoiceDetailObject.put("zeroRateFlag", "");//零税率标识:空,非零税率;1,免税;2,不征税;3,普通零税率;1、当税率为:0%,且增 值税特殊管理:为“免税”, 零税率标识:需传“1” 2、当税率为:0%,且增值 税特殊管理:为"不征税" 零税率标识:需 传“2” 3、当税率为:0%,且增值税特 殊管理:为空 零税率标识:需传“3” invoiceDetailArray.add(invoiceDetailObject); i++; } orderObject.put("invoiceDetail", invoiceDetailArray); contentObject.put("order", orderObject); JSONObject result = new OpenApi().requestApi("nuonuo.ElectronInvoice.requestBillingNew", contentObject.toString()); if (result.containsKey("code") && result.getString("code").equalsIgnoreCase("E0000")) { String invoiceSerialNum = result.getJSONObject("result").getString("invoiceSerialNum"); setValue("finvoiceserialnum", invoiceSerialNum, 11L); } if (result.containsKey("describe")) { String describe = result.getString("describe"); setValue("msg", describe, 11L); } } private String createstr(int length, String str) { // 长度 if (length > str.length()) { str = String.format("%0" + (length) + "d", Long.parseLong(str)); } return str; } /** * 将发票下载到本地 * * @param urlstr * @return */ public void upLoadDocUrl(String urlstr, String description) { String doctype = "Attachments"; try { String str = urlstr.substring(urlstr.lastIndexOf("/") + 1); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); try { URL url = new URL(urlstr); HttpURLConnection httpUrl = (HttpURLConnection) url.openConnection(); httpUrl.connect(); BufferedInputStream bis = new BufferedInputStream(httpUrl.getInputStream()); byte[] arrayOfByte = new byte[4096]; int i; while (-1 != (i = bis.read(arrayOfByte))) { byteArrayOutputStream.write(arrayOfByte, 0, i); } } catch (IOException iOException) { } UploadFile uploadFile = new UploadFile(str, "image\\png", byteArrayOutputStream); Properties properties = P2Server.getP2Server().getConfig(); StringBuffer stringBuffer = new StringBuffer(properties.getProperty("p2.attachment.defaultpath")); String str1 = properties.getProperty("p2.attachment.ostype"); String str2 = ""; PaoSetRemote ps_sysvarsSet = P2Server.getP2Server().getPaoSet("PS_SYSVARS", P2Server.getP2Server().getSystemUserInfo()); ps_sysvarsSet.setWhere("varname='DOCUMENT_DIR_RULE'"); ps_sysvarsSet.reset(); if (!ps_sysvarsSet.isEmpty()) { String[] arrayOfString = ps_sysvarsSet.getPao(0).getString("varvalue") .split("[/]"); stringBuffer.append(File.separator + getString("siteid")); str2 = str2 + getString("siteid") + "/"; for (byte b = 1; b < arrayOfString.length; b++) { if ("DOCTYPE".equalsIgnoreCase(arrayOfString[b])) { stringBuffer.append(File.separator + doctype); str2 = str2 + doctype + "/"; } else if ("TABLE".equalsIgnoreCase(arrayOfString[b])) { stringBuffer.append(File.separator + getName().toUpperCase()); str2 = str2 + getName().toUpperCase() + "/"; } } } ps_sysvarsSet.close(); String str3 = stringBuffer.toString(); String filename = uploadFile.getFileName(); String filetype = filename.substring(filename.lastIndexOf(".") + 1); //filename = "url附件"; try { uploadFile.setDirectoryName(str3); uploadFile.writeToDisk(); str3 = uploadFile.getAbsoluteFileName(); File file = new File(str3); if (str1 != null && !Utility.isNull(str1.trim()) && str1.trim().equalsIgnoreCase("OSS")) { UploadFileOSS uploadFileOSS; (uploadFileOSS = new UploadFileOSS(str3, uploadFile.getFileName(), "", str2)).writeOSS(); if (file.exists() && file.isFile()) { file.delete(); } } if (!Utility.isNull(str3)) { uploadFile.save(); } } catch (IOException iOException) { } str3 = uploadFile.getFileName(); PaoRemote paoRemote; PaoSetRemote paoSetRemote3; (paoRemote = (paoSetRemote3 = P2Server.getP2Server().getPaoSet("DOCINFO", P2Server.getP2Server().getSystemUserInfo())).add()) .setValue("document", filename, 11L); paoRemote.setValue("ownertable", getName().toUpperCase(), 11L); paoRemote.setValue("description", description, 11L); paoRemote.setValue("postfix", filetype, 11L); paoRemote.setValue("doctype", doctype, 11L); paoRemote.setValue("serialnumber", str3, 11L); paoRemote.setValue("siteid", getString("siteid"), 11L); paoSetRemote3.save(); PaoSetRemote paoSetRemote1; if ((paoSetRemote1 = paoRemote.getPaoSet("DOCLINKS")).isEmpty()) { PaoRemote paoRemote1; (paoRemote1 = paoSetRemote1.add()).setValue("document", filename, 11L); paoRemote1.setValue("docinfoid", paoRemote.getLong("docinfoid"), 11L); paoRemote1.setValue("ownertable", getName().toUpperCase(), 11L); paoRemote1.setValue("DOCTYPE", doctype, 11L); paoRemote1.setValue("description", description, 11L); paoRemote1.setValue("OWNERID", getUniqueIDValue(), 11L); paoSetRemote1.save(); paoSetRemote1 = paoRemote1.getPaoSet("$DOCHISTORY", "DOCHISTORY", ""); ((Doclinks) paoRemote1).addDochistory(paoSetRemote1, "Add"); paoSetRemote1.save(); } paoSetRemote3.close(); } catch (Exception exception) { exception.printStackTrace(); } } // public static void main(String[] args) throws Exception { // tinvoicebill tinvoicebill = new tinvoicebill(null); // String a = tinvoicebill.createPrintStr("3300062620", "00848776", 220); // System.err.println(a); // } public void createPrintStr(String FPDM, String FPHM, double famount) { String printstr = ""; try { //明文 String content = "01!" + FPDM + "!" + FPHM + "!" + famount; //AES密文 String aes = aesEncryptC(content, "0ozSri9LpPvz0f6H"); String pub = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClj0t1b+O5Cq06d0yp4qZHM3OhNSmoaArC6qAhehT/DB23F/CCUSFrQCjADhOvCq+xu4JcNGQ1kpjhKVNb642QPlSDJ04QM/+3mKcu/WKLDZ+3zQYvNY41pcjTyxtUT9ixaBx8OQQfOp+qiAYYBtE9T6WRLCrl1YN0drpDvFylyQIDAQAB"; //Rsa密文 //System.out.println("公钥加密:" + encrypt(aes, getPublickey(pub))); //示例 String rsa = URLEncoder.encode(OpenApi.taxnum + "!" + encrypt(aes, getPublickey(pub)) + "!01", "UTF-8"); printstr = " 发票打印 "; setValue("fprintparameter", printstr, 11L); } catch (Exception e) { e.printStackTrace(); } } /** * RSA最大加密明文大小 */ private static final int MAX_ENCRYPT_BLOCK = 117; /** * RSA最大解密密文大小 */ private static final int MAX_DECRYPT_BLOCK = 128; /** * 默认字符集编码 */ private static final String DEFAULT_CHARSET = "UTF-8"; /** * RSA加密 * * @param data 待加密数据 * @param publicKey 公钥 * @return * @author pcheng * @date 2018-6-25 */ public static String encrypt(String data, PublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); int inputLen = data.getBytes(DEFAULT_CHARSET).length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 对数据分段加密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(data.getBytes(DEFAULT_CHARSET), offSet, MAX_ENCRYPT_BLOCK); } else { cache = cipher.doFinal(data.getBytes(DEFAULT_CHARSET), offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_ENCRYPT_BLOCK; } byte[] encryptedData = out.toByteArray(); out.close(); /*获取加密内容以UTF-8为标准转化的字节进行加密后再使用base64编码成字符串*/ /*加密后的字符串*/ return Base64.encodeBase64String(encryptedData); } /** * 获取公钥 * * @param publicKey 公钥字符串 * @return 公钥对象 * @throws Exception */ public static PublicKey getPublickey(String publicKey) throws Exception { KeyFactory keyFactory = KeyFactory.getInstance("RSA"); X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey.getBytes())); return keyFactory.generatePublic(bobPubKeySpec); } /** * AES加密 ECB加密 * * @param encryptStr 待加密的base 64 code * @param decryptKey 加密密钥 * @return 加密后的string * @throws Exception */ public static String aesEncryptC(String encryptStr, String decryptKey) throws Exception { return parseByte2HexStr(aesEncryptToBytesC(encryptStr, decryptKey)); } /** * AES加密 ECB * * @param content 待加密的内容 * @param encryptKey 加密密钥 * @return 加密后的byte[] * @throws Exception */ private static byte[] aesEncryptToBytesC(String content, String encryptKey) { try { Cipher aesECB = Cipher.getInstance("AES/ECB/PKCS5Padding"); SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "AES"); aesECB.init(Cipher.ENCRYPT_MODE, key); byte[] result = aesECB.doFinal(content.getBytes("UTF-8")); return result; } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } /** * 将二进制转换成16进制 * * @param buf * @return */ private static String parseByte2HexStr(byte[] buf) { StringBuffer sb = new StringBuffer(); if (buf == null) { return sb.toString(); } for (int i = 0; i < buf.length; i++) { String hex = Integer.toHexString(buf[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } sb.append(hex.toUpperCase()); } return sb.toString(); } @Override public void fieldValidate(Object paoField, String fieldname) throws P2Exception { super.fieldValidate(paoField, fieldname); } @Override public void fieldAction(Object paoField, String fieldname) throws P2Exception { super.fieldAction(paoField, fieldname); } }