| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733 |
- 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<PaoRemote> 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 = "<a href=webprint:\"0," + rsa + "> 发票打印 </a>";
- 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);
- }
- }
|