|
|
@@ -0,0 +1,958 @@
|
|
|
+package com.uas.platform.b2b.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.uas.platform.b2b.dao.PurchaseApBillOutDao;
|
|
|
+import com.uas.platform.b2b.dao.PurchaseApBillOutInfoDao;
|
|
|
+import com.uas.platform.b2b.model.Product;
|
|
|
+import com.uas.platform.b2b.model.PurchaseApBillOut;
|
|
|
+import com.uas.platform.b2b.model.PurchaseApBillOutInfo;
|
|
|
+import com.uas.platform.b2b.model.PurchaseApBillOutItem;
|
|
|
+import com.uas.platform.b2b.service.PiaoPlusService;
|
|
|
+import com.uas.platform.b2b.support.SystemSession;
|
|
|
+import com.uas.platform.core.util.HttpUtil;
|
|
|
+import com.uas.ps.core.util.StringUtils;
|
|
|
+import com.uas.sso.common.encrypt.MD5;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.ui.ModelMap;
|
|
|
+
|
|
|
+import java.io.UnsupportedEncodingException;
|
|
|
+import java.net.URLEncoder;
|
|
|
+import java.text.DecimalFormat;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class PiaoPlusServiceImpl implements PiaoPlusService{
|
|
|
+ @Autowired
|
|
|
+ PurchaseApBillOutDao purchaseApBillOutDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ PurchaseApBillOutInfoDao purchaseApBillOutInfoDao;
|
|
|
+
|
|
|
+ DecimalFormat df = new DecimalFormat("#.00");
|
|
|
+ private boolean isBaiWang = true;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ModelMap invoiceIssued(PurchaseApBillOut apBillOut) {
|
|
|
+ ModelMap result = new ModelMap();
|
|
|
+ StringBuilder errorMsg = new StringBuilder();
|
|
|
+
|
|
|
+ String url = "http://192.168.253.75:8282/icloud/invoice/issue.json";
|
|
|
+ String invoiceKind = "004";//004:专票,007:普票, 026:电子票.百望税盘必填
|
|
|
+ String eqptType = "1";//设备类型 0税控服务,1税控盘.百望税盘必填
|
|
|
+ String collectorPhone = "18770087064";
|
|
|
+ String drawer = SystemSession.getUser().getUserName();
|
|
|
+ String taxDiskCode = "";
|
|
|
+ String taxDiskPwd = "";
|
|
|
+ String taxSignPwd = "";
|
|
|
+
|
|
|
+ Set<PurchaseApBillOutItem> apBillOutItems = apBillOut.getItems();
|
|
|
+ //获取购方开票信息
|
|
|
+ PurchaseApBillOutInfo customerApBillOutInfo = apBillOut.getCustomerApBillOutInfo();
|
|
|
+ if (customerApBillOutInfo == null) {
|
|
|
+ result.put("error", errorMsg.append("获取不到购方开票信息,请先完善!"));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ //获取销方开票信息
|
|
|
+ PurchaseApBillOutInfo apBillOutInfo = apBillOut.getApBillOutInfo();
|
|
|
+ if (apBillOutInfo == null) {
|
|
|
+ result.put("error", errorMsg.append("获取不到销方开票信息,请先完善!"));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ //签名部分
|
|
|
+ List<String> paras = new ArrayList<>();
|
|
|
+ paras.add("buyerName=" + apBillOut.getCustName());
|
|
|
+ paras.add("collectorPhone=" + collectorPhone);//TODO 收票人手机
|
|
|
+ paras.add("drawer=" + drawer);//开票人
|
|
|
+ paras.add("orderNo=" + apBillOut.getCode());
|
|
|
+ //专票时以下参数参与签名
|
|
|
+ if ("004".equals(invoiceKind)) {
|
|
|
+ paras.add("buyerTaxpayerId=" + customerApBillOutInfo.getTaxNr());
|
|
|
+ paras.add("buyerAddr=" + customerApBillOutInfo.getAddress());
|
|
|
+ paras.add("buyerMobile=" + customerApBillOutInfo.getTel());
|
|
|
+ paras.add("buyerAccountNo=" + customerApBillOutInfo.getBankAccountNr());
|
|
|
+ }
|
|
|
+ paras.add("taxpayerId=" + apBillOutInfo.getTaxNr());
|
|
|
+ //百望税盘时以下参数参与 //TODO 判断
|
|
|
+ if (isBaiWang && "1".equals(eqptType)) {
|
|
|
+ paras.add("issueAddressCode=" + apBillOut.getKpdh());//TODO 开票点代码
|
|
|
+ paras.add("eqptType=" + eqptType);
|
|
|
+ paras.add("invoiceKind=" + invoiceKind);//TODO 发票种类编码
|
|
|
+ //百望税盘且设备类型eqptType为1参与
|
|
|
+ paras.add("taxDiskCode=" + taxDiskCode);//T税控盘编号
|
|
|
+ paras.add("taxDiskPwd=" + taxDiskPwd);//税控盘口令
|
|
|
+ paras.add("taxSignPwd=" + taxSignPwd);//税务数字证书密码
|
|
|
+ }
|
|
|
+ String[] paraArr = new String[paras.size()];
|
|
|
+ String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
|
|
|
+ String sign = sign("icloud/invoice/issue.json", "POST", timestamp, paras.toArray(paraArr));
|
|
|
+
|
|
|
+ Map<String,Object> paraMap = new HashMap<>();
|
|
|
+ if (StringUtils.isEmpty(apBillOutInfo.getTaxNr())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到纳税人识别号!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOut.getCustName())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到购买方名称!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(collectorPhone)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到收票人手机!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(drawer)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到开票人名称!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOut.getCode())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到订单号!"));
|
|
|
+ }
|
|
|
+ paraMap.put("taxpayerId", apBillOutInfo.getTaxNr());//纳税人识别号
|
|
|
+ paraMap.put("buyerName", apBillOut.getCustName());//购买方名称
|
|
|
+ paraMap.put("collectorPhone", collectorPhone);//TODO 收票人手机
|
|
|
+ paraMap.put("drawer", SystemSession.getUser().getUserName());//开票人
|
|
|
+ paraMap.put("orderNo", apBillOut.getCode());//订单号
|
|
|
+ //以下为可为空字段
|
|
|
+ paraMap.put("saleAccountNo", customerApBillOutInfo.getBankAccountNr());//销售方银行账号
|
|
|
+ paraMap.put("buyerTaxpayerId", customerApBillOutInfo.getTaxNr());//购买方识别号
|
|
|
+ paraMap.put("buyerAddr", customerApBillOutInfo.getAddress());//购买方地址
|
|
|
+ paraMap.put("buyerMobile", customerApBillOutInfo.getTel());//购买方电话
|
|
|
+ paraMap.put("buyerAccountNo", customerApBillOutInfo.getBankAccountNr());//购买方银行及账号 开户行及账号
|
|
|
+ paraMap.put("storeCode", "");//店铺编码
|
|
|
+ paraMap.put("buyerEmail", "");//购买方邮箱
|
|
|
+ paraMap.put("payee", customerApBillOutInfo.getPayee());//收款人
|
|
|
+ paraMap.put("checker", customerApBillOutInfo.getChecker());//复核人
|
|
|
+ paraMap.put("priceTaxAmount", apBillOut.getTaxSum());//价税合计金额 小数点后2位,以元为单位精确到分
|
|
|
+ if (isBaiWang && StringUtils.isEmpty(apBillOut.getKpdh())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的开票点代码!"));
|
|
|
+ }
|
|
|
+ if (isBaiWang && StringUtils.isEmpty(eqptType)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的设备的类型!"));
|
|
|
+ }
|
|
|
+ if (isBaiWang && StringUtils.isEmpty(invoiceKind)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的开票的类型!"));
|
|
|
+ }
|
|
|
+ if (isBaiWang && "1".equals(eqptType) && StringUtils.isEmpty(taxDiskCode)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的税控盘编号!"));
|
|
|
+ }
|
|
|
+ if (isBaiWang && "1".equals(eqptType) && StringUtils.isEmpty(taxDiskPwd)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的税控盘口令!"));
|
|
|
+ }
|
|
|
+ if (isBaiWang && "1".equals(eqptType) && StringUtils.isEmpty(taxSignPwd)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的税务数字证书密码!"));
|
|
|
+ }
|
|
|
+ if (result.size() > 0) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ paraMap.put("issueAddressCode", apBillOut.getKpdh());//开票点代码 百望税盘必填
|
|
|
+ paraMap.put("eqptType", eqptType);//设备类型 0税控服务,1税控盘.百望税盘必填
|
|
|
+ paraMap.put("invoiceKind", invoiceKind);//004:专票,007:普票,026:电子票.百望税盘必填
|
|
|
+ paraMap.put("taxDiskCode", taxDiskCode);//税控盘编号 百望税盘且设备类型为1必填
|
|
|
+ paraMap.put("taxDiskPwd", taxDiskPwd);//税控盘口令 百望税盘且设备类型为1必填
|
|
|
+ paraMap.put("taxSignPwd", taxSignPwd);//税务数字证书密码 百望税盘且设备类型为1必填
|
|
|
+ paraMap.put("remark", apBillOut.getRemark());
|
|
|
+
|
|
|
+ JSONArray wares = new JSONArray();
|
|
|
+ for (PurchaseApBillOutItem apBillOutItem : apBillOutItems) {
|
|
|
+ // wares 商品行项目信息(发票明细)
|
|
|
+ JSONObject ware = new JSONObject(16, true);
|
|
|
+ Product product = apBillOutItem.getProduct();
|
|
|
+ if (product == null) {
|
|
|
+ result.put("error", errorMsg.append("获取不到商品信息!"));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(product.getTitle())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到商品名称!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOutItem.getNowQty())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到商品开票数量!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOutItem.getNowPrice())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到商品开票单价!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(product.getGoodstaxno())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到商品编码!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOutItem.getTaxrate())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到商品税率!"));
|
|
|
+ }
|
|
|
+ ware.put("wareName", product.getTitle());//商品名称
|
|
|
+ ware.put("count", apBillOutItem.getNowQty());//数量 整数
|
|
|
+ ware.put("unitPrice", apBillOutItem.getNowPrice());//单价 小数点后2位,以元为单位精确到分,含税价
|
|
|
+ ware.put("wareNo", product.getGoodstaxno());//商品编码 应与税局最新发行的商品和服务税收分类与编码相一致
|
|
|
+ ware.put("taxRate", apBillOutItem.getTaxrate());
|
|
|
+ //否
|
|
|
+ ware.put("unit", product.getUnit());//单位
|
|
|
+ ware.put("standard", product.getSpec());//规格型号
|
|
|
+ ware.put("discountAmount", "");//优惠后总额
|
|
|
+
|
|
|
+ wares.add(ware);
|
|
|
+ }
|
|
|
+
|
|
|
+ paraMap.put("wareListInfo", wares.toString());
|
|
|
+
|
|
|
+ //调用票加加开票接口
|
|
|
+ try {
|
|
|
+ HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
|
|
|
+ JSONObject resultJo = JSON.parseObject(response.getResponseText());
|
|
|
+ String code = resultJo.getString("code");//结果码 0000代表成功,其它为失败
|
|
|
+ String resMsg = resultJo.getString("resMsg");
|
|
|
+ String requestCode = resultJo.getString("requestCode");//请求流水号
|
|
|
+ if ("0000".equals(code)) {
|
|
|
+ apBillOut.setRetmsg(resMsg);
|
|
|
+ apBillOut.setRequestCode(requestCode);
|
|
|
+ //修改开票单状态
|
|
|
+ apBillOut.setCheckStatus("已开票");
|
|
|
+
|
|
|
+ try {
|
|
|
+ purchaseApBillOutDao.save(apBillOut);
|
|
|
+ } catch (Exception e) {
|
|
|
+ result.put("dbError","开具发票成功,但过程中数据库更新开票单失败,需要人工紧急处理,作废此开票单据");
|
|
|
+ }
|
|
|
+
|
|
|
+ result.put("apBillOut",apBillOut);
|
|
|
+ } else {
|
|
|
+ result.put("resultJo",resultJo);
|
|
|
+ //map.put("error","发票开具失败");
|
|
|
+ result.put("error",errorMsg.append(resMsg));
|
|
|
+ }
|
|
|
+ } catch (NullPointerException e) {
|
|
|
+ result.put("error",errorMsg.append("从票加加开票接口获取数据失败"));
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (Exception e) {
|
|
|
+ result.put("error",errorMsg.append("链接票加加开票接口失败"));
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ModelMap InvoiceCancel(PurchaseApBillOut apBillOut) {
|
|
|
+ ModelMap result = new ModelMap();
|
|
|
+ StringBuilder errorMsg = new StringBuilder();
|
|
|
+
|
|
|
+ String url = "http://192.168.253.75:8282/icloud/invoice/revoke.json";
|
|
|
+ String invoiceKind = "004";//004:专票,007:普票, 026:电子票.百望税盘必填
|
|
|
+ String eqptType = "1";//设备类型 0税控服务,1税控盘.百望税盘必填
|
|
|
+ String taxDiskCode = "";
|
|
|
+ String taxDiskPwd = "";
|
|
|
+ String taxSignPwd = "";
|
|
|
+
|
|
|
+ Set<PurchaseApBillOutItem> apBillOutItems = apBillOut.getItems();
|
|
|
+ //获取购方开票信息
|
|
|
+ PurchaseApBillOutInfo customerApBillOutInfo = apBillOut.getCustomerApBillOutInfo();
|
|
|
+ if (customerApBillOutInfo == null) {
|
|
|
+ result.put("error", errorMsg.append("获取不到购方开票信息,请先完善!"));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ //获取销方开票信息
|
|
|
+ PurchaseApBillOutInfo apBillOutInfo = apBillOut.getApBillOutInfo();
|
|
|
+ if (apBillOutInfo == null) {
|
|
|
+ result.put("error", errorMsg.append("获取不到销方开票信息,请先完善!"));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ //签名部分
|
|
|
+ List<String> paras = new ArrayList<>();
|
|
|
+ paras.add("orderNo=" + apBillOut.getCode());
|
|
|
+ paras.add("replacedInvoiceCode=" + apBillOut.getInfoTypeCode());
|
|
|
+ paras.add("replacedInvoiceNo=" + apBillOut.getInfoNumber());
|
|
|
+ paras.add("revokeReson=" + "");//冲红原因
|
|
|
+ paras.add("taxpayerId=" + apBillOutInfo.getTaxNr());
|
|
|
+ //百望税盘参与 //TODO 判断
|
|
|
+ if (isBaiWang) {
|
|
|
+ paras.add("eqptType=" + eqptType);
|
|
|
+ paras.add("issueAddressCode=" + apBillOut.getKpdh());//TODO 开票点代码
|
|
|
+ paras.add("invoiceKind=" + invoiceKind);//TODO 发票种类编码
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isBaiWang && "1".equals(eqptType)) {
|
|
|
+ paras.add("taxDiskCode=" + taxDiskCode);// 税控盘编号
|
|
|
+ paras.add("taxDiskPwd=" + taxDiskPwd);// 税控盘口令
|
|
|
+ paras.add("taxSignPwd=" + taxSignPwd);// 税务数字证书密码
|
|
|
+ }
|
|
|
+
|
|
|
+ int kplx = -1;//TODO 开票类型
|
|
|
+ if (isBaiWang && kplx < 0 && "004".equals(invoiceKind)) {
|
|
|
+ paras.add("redInfoCode=" + "");//TODO 红字信息表编号
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isBaiWang && "004".equals(invoiceKind)) {
|
|
|
+ paras.add("noticeOrderCode=" + "");//TODO 通知单编号
|
|
|
+ }
|
|
|
+
|
|
|
+ String[] paraArr = new String[paras.size()];
|
|
|
+ String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
|
|
|
+ String sign = sign("icloud/invoice/revoke.json", "POST", timestamp, paras.toArray(paraArr));
|
|
|
+
|
|
|
+ Map<String,Object> paraMap = new HashMap<>();
|
|
|
+ String revokeReson = "";
|
|
|
+ if (StringUtils.isEmpty(apBillOutInfo.getTaxNr())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到纳税人识别号!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOut.getInfoTypeCode())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到原发票代码!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOut.getInfoNumber())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到原发票号码!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(revokeReson)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到冲红原因!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOut.getCode())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到订单号!"));
|
|
|
+ }
|
|
|
+ paraMap.put("taxpayerId", apBillOutInfo.getTaxNr());//纳税人识别号
|
|
|
+ paraMap.put("replacedInvoiceCode", apBillOut.getInfoTypeCode());//原发票代码
|
|
|
+ paraMap.put("replacedInvoiceNo", apBillOut.getInfoNumber());//原发票号码
|
|
|
+ paraMap.put("revokeReson", revokeReson);//冲红原因
|
|
|
+ paraMap.put("orderNo", apBillOut.getCode());//订单号
|
|
|
+ //以下为可为空字段
|
|
|
+ String issueAddressCode = apBillOut.getKpdh();
|
|
|
+ String redInfoCode = "";
|
|
|
+ String noticeOrderCode = "";
|
|
|
+ if (isBaiWang && StringUtils.isEmpty(issueAddressCode)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的开票点代码!"));
|
|
|
+ }
|
|
|
+ if (isBaiWang && StringUtils.isEmpty(eqptType)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的设备的类型!"));
|
|
|
+ }
|
|
|
+ if (isBaiWang && StringUtils.isEmpty(invoiceKind)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的开票的类型!"));
|
|
|
+ }
|
|
|
+ if (isBaiWang && "1".equals(eqptType) && StringUtils.isEmpty(taxDiskCode)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的税控盘编号!"));
|
|
|
+ }
|
|
|
+ if (isBaiWang && "1".equals(eqptType) && StringUtils.isEmpty(taxDiskPwd)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的税控盘口令!"));
|
|
|
+ }
|
|
|
+ if (isBaiWang && "1".equals(eqptType) && StringUtils.isEmpty(taxSignPwd)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的税务数字证书密码!"));
|
|
|
+ }
|
|
|
+ if (isBaiWang && "004".equals(invoiceKind) && StringUtils.isEmpty(redInfoCode)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时专票冲红的红字信息表编号!"));
|
|
|
+ }
|
|
|
+ if (isBaiWang && "004".equals(invoiceKind) && StringUtils.isEmpty(noticeOrderCode)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时专票冲红的通知单编号!"));
|
|
|
+ }
|
|
|
+ if (result.size() > 0) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ paraMap.put("issueAddressCode", issueAddressCode);//开票点代码 百望税盘必填
|
|
|
+ paraMap.put("eqptType", eqptType);//设备类型 0税控服务,1税控盘.百望税盘必填
|
|
|
+ paraMap.put("invoiceKind", invoiceKind);//004:专票,007:普票,026:电子票.百望税盘必填
|
|
|
+ paraMap.put("taxDiskCode", taxDiskCode);//税控盘编号 百望税盘且设备类型为1必填
|
|
|
+ paraMap.put("taxDiskPwd", taxDiskPwd);//税控盘口令 百望税盘且设备类型为1必填
|
|
|
+ paraMap.put("taxSignPwd", taxSignPwd);//税务数字证书密码 百望税盘且设备类型为1必填
|
|
|
+ paraMap.put("redInfoCode", redInfoCode);//红字信息表编号 百望税盘, 专票红冲时,必填。
|
|
|
+ paraMap.put("noticeOrderCode", noticeOrderCode);//通知单编号 百望税盘,专票红冲时,必填。
|
|
|
+
|
|
|
+
|
|
|
+ //调用票加加冲红接口
|
|
|
+ try {
|
|
|
+ HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
|
|
|
+ JSONObject resultJo = JSON.parseObject(response.getResponseText());
|
|
|
+ String code = resultJo.getString("code");//结果码 0000代表成功,其它为失败
|
|
|
+ String resMsg = resultJo.getString("resMsg");
|
|
|
+ String requestCode = resultJo.getString("requestCode");//请求流水号
|
|
|
+ if ("0000".equals(code)) {
|
|
|
+ apBillOut.setRetmsg(resMsg);
|
|
|
+ apBillOut.setRequestCode(requestCode);
|
|
|
+ //修改开票单状态
|
|
|
+ apBillOut.setCheckStatus("已作废");
|
|
|
+
|
|
|
+ try {
|
|
|
+ purchaseApBillOutDao.save(apBillOut);
|
|
|
+ } catch (Exception e) {
|
|
|
+ result.put("dbError","冲红发票成功,但过程中数据库更新开票单失败,需要人工紧急处理,作废此开票单据");
|
|
|
+ }
|
|
|
+
|
|
|
+ result.put("apBillOut",apBillOut);
|
|
|
+ } else {
|
|
|
+ result.put("resultJo",resultJo);
|
|
|
+ result.put("error",errorMsg.append(resMsg));
|
|
|
+ }
|
|
|
+ } catch (NullPointerException e) {
|
|
|
+ result.put("error",errorMsg.append("从票加加开票接口获取数据失败"));
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (Exception e) {
|
|
|
+ result.put("error",errorMsg.append("链接票加加开票接口失败"));
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ModelMap queryInvoiceMessage(PurchaseApBillOut apBillOut) {
|
|
|
+ Map<String,Object> paraMap = new HashMap<>();
|
|
|
+ String url = "http://192.168.253.75:8282/icloud/invoice/query.json";
|
|
|
+ String invoiceKind = "004";//004:专票,007:普票, 026:电子票.百望税盘必填
|
|
|
+ String eqptType = "1";//设备类型 0税控服务,1税控盘.百望税盘必填
|
|
|
+
|
|
|
+ Set<PurchaseApBillOutItem> apBillOutItems = apBillOut.getItems();
|
|
|
+ //获取购方开票信息
|
|
|
+ PurchaseApBillOutInfo customerApBillOutInfo = apBillOut.getCustomerApBillOutInfo();
|
|
|
+ //获取销方开票信息
|
|
|
+ PurchaseApBillOutInfo apBillOutInfo = apBillOut.getApBillOutInfo();
|
|
|
+
|
|
|
+ //签名部分 发票代码+发票号码、订单号三选一.传入什么参数就用什么参数签名,为空不参与签名
|
|
|
+ List<String> paras = new ArrayList<>();
|
|
|
+ String invoiceCode = apBillOut.getInfoTypeCode();
|
|
|
+ String invoiceNum = apBillOut.getInfoNumber();
|
|
|
+ String orderNo = apBillOut.getCode();
|
|
|
+ String requestCode = "";//请求流水号
|
|
|
+ if (StringUtils.isEmpty(requestCode) && (StringUtils.isEmpty(invoiceCode) && StringUtils.isEmpty(invoiceNum)) && StringUtils.isEmpty(orderNo)) {
|
|
|
+ //TODO 为空不参与签名
|
|
|
+ } else if (!StringUtils.isEmpty(requestCode)){
|
|
|
+ paras.add("requestCode=" + requestCode);
|
|
|
+ paraMap.put("requestCode", requestCode);
|
|
|
+ } else if (!(StringUtils.isEmpty(invoiceNum) && StringUtils.isEmpty(invoiceCode))) {
|
|
|
+ paras.add("invoiceCode=" + invoiceCode);
|
|
|
+ paras.add("invoiceNum=" + invoiceNum);
|
|
|
+ paraMap.put("invoiceCode", invoiceCode);
|
|
|
+ paraMap.put("invoiceNum", invoiceNum);
|
|
|
+ } else if (!StringUtils.isEmpty(orderNo)) {
|
|
|
+ paras.add("orderNo=" + orderNo);
|
|
|
+ paraMap.put("orderNo", orderNo);
|
|
|
+ }
|
|
|
+
|
|
|
+ paras.add("taxpayerId=" + apBillOutInfo.getTaxNr());
|
|
|
+ String[] paraArr = new String[paras.size()];
|
|
|
+ String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
|
|
|
+ String sign = sign("icloud/invoice/query.json", "POST", timestamp, paras.toArray(paraArr));
|
|
|
+
|
|
|
+ paraMap.put("taxpayerId", apBillOutInfo.getTaxNr());//纳税人识别号
|
|
|
+ paraMap.put("needItem", false);//是否需要商品详情
|
|
|
+
|
|
|
+ //调用票加加查询开票接口
|
|
|
+ try {
|
|
|
+ HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
|
|
|
+ JSONObject responseJo = JSON.parseObject(response.getResponseText());
|
|
|
+ String code = responseJo.getString("code");//0000代表开具成功,1111代表未开具,2222代表开具中,其它代表开具失败
|
|
|
+ String resMsg = responseJo.getString("resMsg");
|
|
|
+ //TODO 查询结果处理
|
|
|
+
|
|
|
+ } catch (NullPointerException e) {
|
|
|
+ System.out.print("error从票加加开票接口获取数据失败");
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.out.print("error链接票加加开票接口失败");
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ModelMap querybillingcount(String queryDate) {
|
|
|
+ Map<String,Object> paraMap = new HashMap<>();
|
|
|
+ String url = "http://192.168.253.75:8282/icloud/invoice/querybillingcount.json";
|
|
|
+ PurchaseApBillOutInfo apBillOutInfo = purchaseApBillOutInfoDao.findByUu(SystemSession.getUser().getEnterprise().getUu());
|
|
|
+ String taxpayerId = apBillOutInfo.getTaxNr();
|
|
|
+
|
|
|
+ //签名部分
|
|
|
+ List<String> paras = new ArrayList<>();
|
|
|
+ paras.add("taxpayerId=" + taxpayerId);
|
|
|
+ paras.add("queryDate=" + queryDate);
|
|
|
+ String[] paraArr = new String[paras.size()];
|
|
|
+ String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
|
|
|
+ String sign = sign("icloud/invoice/querybillingcount.json", "POST", timestamp, paras.toArray(paraArr));
|
|
|
+
|
|
|
+ paraMap.put("taxpayerId", taxpayerId);
|
|
|
+ paraMap.put("queryDate", queryDate);
|
|
|
+
|
|
|
+ //调用票加加统计开票接口
|
|
|
+ try {
|
|
|
+ HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
|
|
|
+ JSONObject responseJo = JSON.parseObject(response.getResponseText());
|
|
|
+ String code = responseJo.getString("code");//0000代表成功其它代表失败
|
|
|
+ String resMsg = responseJo.getString("resMsg");
|
|
|
+ String totalCount = responseJo.getString("totalCount");//提交开票量
|
|
|
+ String totalSuccCount = responseJo.getString("totalSuccCount");//成功开票量
|
|
|
+ String totalMoney = responseJo.getString("totalMoney");//开票总金额
|
|
|
+
|
|
|
+ } catch (NullPointerException e) {
|
|
|
+ System.out.print("error从票加加开票接口获取数据失败");
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.out.print("error链接票加加开票接口失败");
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ModelMap queryBillLeftCount() {
|
|
|
+ Map<String,Object> paraMap = new HashMap<>();
|
|
|
+ String url = "http://192.168.253.75:8282/icloud/invoice/queryBillLeftCount.json";
|
|
|
+ String eqptType = "1";
|
|
|
+ PurchaseApBillOutInfo apBillOutInfo = purchaseApBillOutInfoDao.findByUu(SystemSession.getUser().getEnterprise().getUu());
|
|
|
+ String taxpayerId = apBillOutInfo.getTaxNr();
|
|
|
+
|
|
|
+ List<String> paras = new ArrayList<>();
|
|
|
+ paras.add("taxpayerId=" + taxpayerId);
|
|
|
+ paraMap.put("taxpayerId", taxpayerId);
|
|
|
+
|
|
|
+ if (isBaiWang) {
|
|
|
+ paras.add("eqptType=" + eqptType);
|
|
|
+ paras.add("machineCode=" + "");
|
|
|
+ paras.add("invoiceKind=" + "");
|
|
|
+ paraMap.put("eqptType", eqptType);//设备类型 0税控服务,1税控盘.百望税盘必填
|
|
|
+ paraMap.put("machineCode", "");//机器编号 百望税盘必填。 设备类型0为:核心板编号、1为:税盘编号
|
|
|
+ paraMap.put("invoiceKind", "");//004:专票,007:普票,026:电子票.百望税盘必填
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isBaiWang && "0".equals(eqptType)) {
|
|
|
+ paras.add("teminalFlag=" + "");
|
|
|
+ paraMap.put("teminalFlag", "");//百望税盘且设备类型为0必填,开票点代码
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isBaiWang && "1".equals(eqptType)) {
|
|
|
+ paras.add("taxDiskCode=" + "");
|
|
|
+ paras.add("taxDiskPwd=" + "");
|
|
|
+ paras.add("taxSignPwd=" + "");
|
|
|
+ paraMap.put("taxDiskCode", "");//税控盘编号 百望税盘且设备类型为1必填
|
|
|
+ paraMap.put("taxDiskPwd", "");//税控盘口令 百望税盘且设备类型为1必填
|
|
|
+ paraMap.put("taxSignPwd", "");//税务数字证书密码 百望税盘且设备类型为1必填
|
|
|
+ }
|
|
|
+
|
|
|
+ String[] paraArr = new String[paras.size()];
|
|
|
+ String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
|
|
|
+ String sign = sign("icloud/invoice/querybillingcount.json", "POST", timestamp, paras.toArray(paraArr));
|
|
|
+
|
|
|
+ //调用票加加统计开票接口
|
|
|
+ try {
|
|
|
+ HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
|
|
|
+ JSONObject responseJo = JSON.parseObject(response.getResponseText());
|
|
|
+ String code = responseJo.getString("code");//0000代表成功其它代表失败
|
|
|
+ String resMsg = responseJo.getString("resMsg");
|
|
|
+ String leftInvoiceNum = responseJo.getString("leftInvoiceNum");//剩余发票量
|
|
|
+
|
|
|
+ } catch (NullPointerException e) {
|
|
|
+ System.out.print("error从票加加开票接口获取数据失败");
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.out.print("error链接票加加开票接口失败");
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ModelMap printInvoice(PurchaseApBillOut apBillOut) {
|
|
|
+ ModelMap result = new ModelMap();
|
|
|
+ StringBuilder errorMsg = new StringBuilder();
|
|
|
+
|
|
|
+ Map<String,Object> paraMap = new HashMap<>();
|
|
|
+ String url = "http://192.168.253.75:8282/icloud/invoice/printInvoice.json";
|
|
|
+ String invoiceKind = "004";//004:专票,007:普票, 026:电子票.百望税盘必填
|
|
|
+ String eqptType = "1";//设备类型 0税控服务,1税控盘.百望税盘必填
|
|
|
+ String taxDiskCode = "";
|
|
|
+ String taxDiskPwd = "";
|
|
|
+ String taxSignPwd = "";
|
|
|
+ String invoiceNum = "";//(税控盘必填)单张打印
|
|
|
+ String printKind = "";//(税控盘必填)0:发票打印,1:清单打印 (批量打印不支持清单打印)
|
|
|
+ String printType = "";//(税控盘必填)1:单张打印
|
|
|
+
|
|
|
+ Set<PurchaseApBillOutItem> apBillOutItems = apBillOut.getItems();
|
|
|
+ //获取购方开票信息
|
|
|
+ //PurchaseApBillOutInfo customerApBillOutInfo = apBillOut.getCustomerApBillOutInfo();
|
|
|
+ //获取销方开票信息
|
|
|
+ PurchaseApBillOutInfo apBillOutInfo = apBillOut.getApBillOutInfo();
|
|
|
+ if (apBillOutInfo == null) {
|
|
|
+ result.put("error", errorMsg.append("获取不到销方开票信息,请先完善!"));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ //签名部分
|
|
|
+ List<String> paras = new ArrayList<>();
|
|
|
+ String issueAddressCode = apBillOut.getKpdh();
|
|
|
+ if (StringUtils.isEmpty(apBillOutInfo.getTaxNr())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到纳税人识别号!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(eqptType)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到设备类型!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(issueAddressCode)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到开票点代码!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(invoiceKind)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到开票类型!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOut.getInfoTypeCode())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到发票代码!"));
|
|
|
+ }
|
|
|
+ paras.add("taxpayerId=" + apBillOutInfo.getTaxNr());
|
|
|
+ paras.add("eqptType="+ eqptType);
|
|
|
+ paras.add("issueAddressCode=" + issueAddressCode);//开票点代码
|
|
|
+ paras.add("invoiceKind=" + invoiceKind);//004:专票,007:普票
|
|
|
+ paras.add("invoiceCode=" + apBillOut.getInfoTypeCode());//发票代码
|
|
|
+
|
|
|
+ paraMap.put("taxpayerId", apBillOutInfo.getTaxNr());
|
|
|
+ paraMap.put("eqptType", eqptType);
|
|
|
+ paraMap.put("issueAddressCode", apBillOut.getKpdh());
|
|
|
+ paraMap.put("invoiceKind", invoiceKind);
|
|
|
+ paraMap.put("invoiceCode", apBillOut.getInfoTypeCode());
|
|
|
+
|
|
|
+ if ("1".equals(eqptType)) {
|
|
|
+ if (StringUtils.isEmpty(invoiceNum)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到税控盘单张打印时发票号码!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(printKind)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到税控盘的打印类型设置!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(printType)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到税控盘打印方式!"));
|
|
|
+ }
|
|
|
+
|
|
|
+ paras.add("invoiceNum=" + invoiceNum);
|
|
|
+ paras.add("printKind=" + printKind);
|
|
|
+ paras.add("printType=" + printType);
|
|
|
+
|
|
|
+ paraMap.put("invoiceNum", invoiceNum);
|
|
|
+ paraMap.put("printKind", printKind);
|
|
|
+ paraMap.put("printType", printType);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (isBaiWang && "1".equals(eqptType)) {
|
|
|
+ if (StringUtils.isEmpty(taxDiskCode)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的税控盘编号!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(taxDiskPwd)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的税控盘口令!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(taxSignPwd)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到百望税盘时的税务数字证书密码!"));
|
|
|
+ }
|
|
|
+
|
|
|
+ paras.add("taxDiskCode=" + taxDiskCode);
|
|
|
+ paras.add("taxDiskPwd=" + taxDiskPwd);
|
|
|
+ paras.add("taxSignPwd=" + taxSignPwd);
|
|
|
+
|
|
|
+ paraMap.put("taxDiskCode", taxDiskCode);
|
|
|
+ paraMap.put("taxDiskPwd", taxDiskPwd);
|
|
|
+ paraMap.put("taxSignPwd", taxSignPwd);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ String[] paraArr = new String[paras.size()];
|
|
|
+ String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
|
|
|
+ String sign = sign("icloud/invoice/printInvoice.json", "POST", timestamp, paras.toArray(paraArr));
|
|
|
+
|
|
|
+ //调用票加加发票打印接口
|
|
|
+ try {
|
|
|
+ HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
|
|
|
+ JSONObject resultJo = JSON.parseObject(response.getResponseText());
|
|
|
+ String code = resultJo.getString("code");//0000代表成功其它代表失败
|
|
|
+ String resMsg = resultJo.getString("resMsg");
|
|
|
+ if ("0000".equals(code)) {
|
|
|
+ result.put("retmsg",resultJo.getString("retmsg"));
|
|
|
+ //添加打印次数
|
|
|
+ apBillOut.setPrint((short) ((apBillOut.getPrint() == null ? 0 : apBillOut.getPrint()) + 1));
|
|
|
+ try {
|
|
|
+ purchaseApBillOutDao.save(apBillOut);
|
|
|
+ } catch (Exception e) {
|
|
|
+ result.put("dbError","发票打印成功,但过程中数据库更新开票单打印次数失败,需要人工处理干预");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ result.put("resultJo",resultJo);
|
|
|
+ result.put("error",errorMsg.append(resMsg));
|
|
|
+ }
|
|
|
+ } catch (NullPointerException e) {
|
|
|
+ result.put("error",errorMsg.append("从票加加开票接口获取数据失败"));
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (Exception e) {
|
|
|
+ result.put("error",errorMsg.append("链接票加加开票接口失败"));
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ModelMap queryDelivery(PurchaseApBillOut apBillOut) {
|
|
|
+ Map<String,Object> paraMap = new HashMap<>();
|
|
|
+ String url = "http://192.168.253.75:8282/imanager/manager/fetchDeliveryTrackingNumbers.ysy";
|
|
|
+ //获取销方开票信息
|
|
|
+ PurchaseApBillOutInfo apBillOutInfo = apBillOut.getApBillOutInfo();
|
|
|
+ String sysOrderNo = apBillOut.getCode();
|
|
|
+ String taxpayerId = apBillOutInfo.getTaxNr();
|
|
|
+ paraMap.put("sysOrderNo", sysOrderNo);
|
|
|
+ paraMap.put("taxpayerId", taxpayerId);
|
|
|
+
|
|
|
+ //调用票加加快递单信息获取接口
|
|
|
+ try {
|
|
|
+ HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
|
|
|
+ JSONObject responseJo = JSON.parseObject(response.getResponseText());
|
|
|
+ String code = responseJo.getString("code");//0000代表成功其它代表失败
|
|
|
+ String resMsg = responseJo.getString("resMsg");
|
|
|
+ String data = responseJo.getString("data");
|
|
|
+ String remark = responseJo.getString("remark");
|
|
|
+ String businessName = responseJo.getString("businessName");
|
|
|
+ String number = responseJo.getString("number");
|
|
|
+ } catch (NullPointerException e) {
|
|
|
+ System.out.print("error从票加加开票接口获取数据失败");
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (Exception e) {
|
|
|
+ System.out.print("error链接票加加开票接口失败");
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public ModelMap uploadInvoice(PurchaseApBillOut apBillOut) {
|
|
|
+ ModelMap result = new ModelMap();
|
|
|
+ StringBuilder errorMsg = new StringBuilder();
|
|
|
+
|
|
|
+ //Map<String,Object> paraMap = new HashMap<>();
|
|
|
+ JSONObject paraMap = new JSONObject(16,true);
|
|
|
+ String url = "http://test.fapiaoxx.com/imanager/manager/getInvoiceInfoFromBPM.ysy";
|
|
|
+ //String eqptType = "1";//设备类型 0税控服务,1税控盘.百望税盘必填
|
|
|
+ String mediumType = "2";//1: 电子发票; 2: 纸质发票
|
|
|
+ String category = "4";//发票分类 1: 增值税专用发票; 4: 增值税普通发票(纸质);10: 增值税普通发票(电子)
|
|
|
+ boolean isZhuanpiao = true;
|
|
|
+
|
|
|
+ Set<PurchaseApBillOutItem> apBillOutItems = apBillOut.getItems();
|
|
|
+ //获取购方开票信息
|
|
|
+ PurchaseApBillOutInfo customerApBillOutInfo = apBillOut.getCustomerApBillOutInfo();
|
|
|
+ if (customerApBillOutInfo == null) {
|
|
|
+ result.put("error", errorMsg.append("获取不到购方开票信息,请先完善!"));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ //获取销方开票信息
|
|
|
+ PurchaseApBillOutInfo apBillOutInfo = apBillOut.getApBillOutInfo();
|
|
|
+ if (apBillOutInfo == null) {
|
|
|
+ result.put("error", errorMsg.append("获取不到销方开票信息,请先完善!"));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ //签名部分
|
|
|
+ List<String> paras = new ArrayList<>();
|
|
|
+ paras.add("sysOrderNo=" + apBillOut.getCode());
|
|
|
+ paras.add("taxpayerId=" + apBillOutInfo.getTaxNr());
|
|
|
+ String timestamp = String.valueOf(System.currentTimeMillis());
|
|
|
+ paras.add("timestamp=" + timestamp);
|
|
|
+ String[] paraArr = new String[paras.size()];
|
|
|
+ String sign = sign("test.fapiaoxx.com/imanager/manager/getInvoiceInfoFromBPM.ysy", "POST", timestamp, paras.toArray(paraArr));
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(apBillOut.getCode())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到申请单编号!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(mediumType)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到发票媒介类型!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(category)) {
|
|
|
+ result.put("error", errorMsg.append("获取不到发票分类!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOutInfo.getTaxNr())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到纳税人识别号!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(customerApBillOutInfo.getEnName())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到购买方名称!"));
|
|
|
+ }
|
|
|
+ paraMap.put("sysOrderNo", apBillOut.getCode());//申请单编号
|
|
|
+ paraMap.put("mediumType", mediumType);//发票媒介类型
|
|
|
+ paraMap.put("category", category);//发票分类
|
|
|
+ paraMap.put("taxpayerId", apBillOutInfo.getTaxNr());
|
|
|
+ paraMap.put("buyerName", customerApBillOutInfo.getEnName());
|
|
|
+ //以下为可为空字段
|
|
|
+ String buyerTaxpayerId = customerApBillOutInfo.getTaxNr();
|
|
|
+ String buyerAddr = apBillOutInfo.getAddress();
|
|
|
+ String buyerMobile = apBillOutInfo.getTel();
|
|
|
+ String buyerAccountNo = apBillOutInfo.getBankAccountNr();
|
|
|
+ if (isZhuanpiao) {
|
|
|
+ if (StringUtils.isEmpty(buyerTaxpayerId)) {
|
|
|
+ result.put("error", errorMsg.append("上传专票申请单时获取不到购买方识别号!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(buyerAddr)) {
|
|
|
+ result.put("error", errorMsg.append("上传专票申请单时获取不到购买方地址!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(buyerMobile)) {
|
|
|
+ result.put("error", errorMsg.append("上传专票申请单时获取不到购方电话!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(buyerAccountNo)) {
|
|
|
+ result.put("error", errorMsg.append("上传专票申请单时获取不到购买方银行及账号!"));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (StringUtils.isEmpty(buyerTaxpayerId)) {
|
|
|
+ buyerTaxpayerId = "";
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(buyerAddr)) {
|
|
|
+ buyerAddr = "";
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(buyerMobile)) {
|
|
|
+ buyerMobile = "";
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(buyerAccountNo)) {
|
|
|
+ buyerAccountNo = "";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ paraMap.put("buyerTaxpayerId", buyerTaxpayerId);
|
|
|
+ paraMap.put("buyerAddr", buyerAddr);
|
|
|
+ paraMap.put("buyerMobile", buyerMobile);
|
|
|
+ paraMap.put("buyerAccountNo", buyerAccountNo);
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(apBillOutInfo.getChecker())) {
|
|
|
+ paraMap.put("checker", "");
|
|
|
+ } else {
|
|
|
+ paraMap.put("checker", apBillOutInfo.getChecker());
|
|
|
+ }
|
|
|
+
|
|
|
+ paraMap.put("drawer", "");
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(apBillOutInfo.getPayee())) {
|
|
|
+ paraMap.put("payee", "");
|
|
|
+ } else {
|
|
|
+ paraMap.put("payee", apBillOutInfo.getPayee());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(apBillOut.getRemark())) {
|
|
|
+ paraMap.put("remark", "");
|
|
|
+ } else {
|
|
|
+ paraMap.put("remark", apBillOut.getRemark());
|
|
|
+ }
|
|
|
+
|
|
|
+ paraMap.put("urlAddress", "");//开票成功回调地址 用于回调开票成功信息
|
|
|
+ paraMap.put("settlementNum", "");//结算单号
|
|
|
+ paraMap.put("contractNum", "");//合同编号
|
|
|
+ paraMap.put("businessInfo", "");//业务信息
|
|
|
+
|
|
|
+ //明细
|
|
|
+ List<JSONObject> wares = new ArrayList<>();
|
|
|
+ for (PurchaseApBillOutItem apBillOutItem : apBillOutItems) {
|
|
|
+ // wares 商品行项目信息(发票明细)
|
|
|
+ Product product = apBillOutItem.getProduct();
|
|
|
+ product.setGoodstaxno((Math.random() + 50) + "");//TODO
|
|
|
+ if (product == null) {
|
|
|
+ result.put("error", errorMsg.append("获取不到商品信息!"));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(product.getTitle())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到商品名称!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(product.getGoodstaxno())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到商品编码!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOutItem.getNowQty())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到商品开票数量!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOutItem.getNowPrice())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到商品开票单价!"));
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(apBillOutItem.getTaxrate())) {
|
|
|
+ result.put("error", errorMsg.append("获取不到商品税率!"));
|
|
|
+ }
|
|
|
+
|
|
|
+ JSONObject ware = new JSONObject(16, true);
|
|
|
+ ware.put("wareName", product.getTitle());//商品名称
|
|
|
+ ware.put("wareNo", "1090232070000000000");//TODO product.getGoodstaxno() 商品编码 应与税局最新发行的商品和服务税收分类与编码相一致
|
|
|
+ if (StringUtils.isEmpty(product.getSpec())) {
|
|
|
+ ware.put("standard", "");//规格型号
|
|
|
+ } else {
|
|
|
+ ware.put("standard", product.getSpec());//规格型号
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(product.getUnit())) {
|
|
|
+ ware.put("unit", "");//单位
|
|
|
+ } else {
|
|
|
+ ware.put("unit", product.getUnit());//单位
|
|
|
+ }
|
|
|
+ ware.put("count", apBillOutItem.getNowQty());//数量 整数
|
|
|
+ ware.put("unitPrice", apBillOutItem.getNowPrice());//单价 小数点后2位,以元为单位精确到分,含税价
|
|
|
+ ware.put("amount", 1.00);//价税合计金额
|
|
|
+ ware.put("taxRate", apBillOutItem.getTaxrate()/100.00);//0表示免税,两位小数,0.17
|
|
|
+ wares.add(ware);
|
|
|
+ }
|
|
|
+
|
|
|
+ paraMap.put("invitem", wares);
|
|
|
+
|
|
|
+ if (result.size() > 0) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ //调用票加加上传接口
|
|
|
+ try {
|
|
|
+ String a = paraMap.toString();
|
|
|
+ url = url + "?timestamp=" + timestamp + "&sign=" + sign;
|
|
|
+ //HttpUtil.Response response = HttpUtil.sendPostRequest(url, paraMap);
|
|
|
+ String resultStr = HttpUtil.sendPost(url, paraMap.toString());
|
|
|
+ JSONObject resultJo = JSON.parseObject(resultStr);
|
|
|
+ String code = resultJo.getString("code");//0000代表成功其它代表失败
|
|
|
+ String resMsg = resultJo.getString("resMsg");;
|
|
|
+
|
|
|
+ if ("0000".equals(code)) {
|
|
|
+ result.put("success", "发票上传成功,开票中!");
|
|
|
+ apBillOut.setRetmsg(resMsg);
|
|
|
+ //apBillOut.setCheckStatus("开票中");
|
|
|
+ try {
|
|
|
+ purchaseApBillOutDao.save(apBillOut);
|
|
|
+ } catch (Exception e) {
|
|
|
+ result.put("dbError","上传发票成功,但过程中数据库更新开票单失败,需要人工紧急处理,重新上传此开票单据");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ result.put("resultJo",resultStr);
|
|
|
+ } catch (NullPointerException e) {
|
|
|
+ result.put("error",errorMsg.append("从票加加开票接口获取数据失败"));
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (Exception e) {
|
|
|
+ result.put("error",errorMsg.append("链接票加加开票接口失败"));
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成签名
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private String sign(String api, String httpMethod, String timestamp, String prars[]) {
|
|
|
+ StringBuilder content = new StringBuilder();
|
|
|
+ content.append(httpMethod);
|
|
|
+ //获取请求的url
|
|
|
+ content.append(api);
|
|
|
+ //参数按字典排序
|
|
|
+ content.append(sort(prars));
|
|
|
+ //content.append("timestamp=" + timestamp);
|
|
|
+ //String taxpayerKey = "626454404969499358070752";//优软
|
|
|
+ String taxpayerKey = "487843442563106693107397";//丰唐
|
|
|
+ content.append(taxpayerKey);
|
|
|
+
|
|
|
+ String sign = null;
|
|
|
+ try {
|
|
|
+ sign = MD5.toMD5(URLEncoder.encode(content.toString(),"UTF-8"));
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return sign;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按字典排序 升序
|
|
|
+ * @param a
|
|
|
+ */
|
|
|
+ public StringBuilder sort(String a[]) {
|
|
|
+ for (int i = 0; i < a.length - 1; i++) {
|
|
|
+ for (int j = i + 1; j < a.length; j++) {
|
|
|
+ if (a[j].compareTo(a[i]) < 0) {
|
|
|
+ String temp = a[i];
|
|
|
+ a[i] = a[j];
|
|
|
+ a[j] = temp;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ StringBuilder paras = new StringBuilder();
|
|
|
+ for (int i = 0; i < a.length; i++) {
|
|
|
+ paras.append(a[i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ return paras;
|
|
|
+ }
|
|
|
+}
|