销项发票信息按照格式下载
This commit is contained in:
parent
7a0094e0e6
commit
5d9dd3c92c
|
@ -0,0 +1,253 @@
|
|||
package nccloud.web.sscivm.ivsale.sale.action;
|
||||
|
||||
import java.io.InputStream;
|
||||
import java.io.UnsupportedEncodingException;
|
||||
import java.security.InvalidKeyException;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
import javax.crypto.Mac;
|
||||
import javax.crypto.spec.SecretKeySpec;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Base64;
|
||||
import java.net.URLEncoder;
|
||||
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.google.gson.Gson;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.http.client.config.CookieSpecs;
|
||||
import org.apache.http.client.config.RequestConfig;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.client.methods.HttpPost;
|
||||
import org.apache.http.entity.StringEntity;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
import com.yonyou.cloud.utils.StringUtils;
|
||||
|
||||
import nc.bs.trade.business.HYSuperDMO;
|
||||
import nc.util.mmf.framework.base.MMValueCheck;
|
||||
import nc.vo.pub.BusinessException;
|
||||
import nc.vo.pubapp.pattern.exception.ExceptionUtils;
|
||||
import nc.vo.sscivm.invoice.IVMInvoiceHeadVO;
|
||||
import nc.vo.sscivm.ivsale.IVApplicationHeadVO;
|
||||
import nc.vo.sscivm.ivsale.IVApplogVO;
|
||||
import nccloud.framework.core.io.WebFile;
|
||||
import nccloud.framework.service.ServiceLocator;
|
||||
import nccloud.framework.web.action.itf.ICommonAction;
|
||||
import nccloud.framework.web.container.IRequest;
|
||||
import nccloud.itf.sscivm.ivsale.service.IVSaleQueryService;
|
||||
import nccloud.pubitf.platform.attachment.IAttachmentService;
|
||||
|
||||
public class InvoiceDownloadAction implements ICommonAction {
|
||||
|
||||
IAttachmentService ncservice = ServiceLocator.find(IAttachmentService.class);
|
||||
|
||||
@Override
|
||||
public Object doAction(IRequest request) {
|
||||
|
||||
Map<String, String[]> params_1 = request.readParameters();
|
||||
|
||||
String[] pk = params_1.get("pk");
|
||||
String[] invoiceTypes = params_1.get("invoiceType");
|
||||
String isdoc = "z";
|
||||
WebFile file = null;
|
||||
try {
|
||||
List<IVMInvoiceHeadVO> headVOList =ServiceLocator.find(IVSaleQueryService.class).queryIVMInvoiceHeadVOsByPks(new String[] {pk[0]});
|
||||
IVMInvoiceHeadVO headVO = headVOList.get(0);
|
||||
String invoiceType = invoiceTypes[0];
|
||||
|
||||
|
||||
// 获取旗舰版的token
|
||||
String appKey = "8c9eb1ea1ba54b3f9683a8b355f8e615";
|
||||
String appSecret = "999e15c2a13ee4eab480534be4bf52fdf9032a6d";
|
||||
String tokenUrl="https://c2.yonyoucloud.com/iuap-api-auth/open-auth/selfAppAuth/getAccessToken";
|
||||
String getbsfileUrl="https://c2.yonyoucloud.com/iuap-api-gateway/yonbip/tax/output-tax/api/einvoice/getbsfile?access_token=";
|
||||
|
||||
Map<String, String> params = new HashMap<>();
|
||||
|
||||
// 除签名外的其他参数
|
||||
params.put("appKey", appKey);
|
||||
String timestamp = String.valueOf(System.currentTimeMillis());
|
||||
params.put("timestamp", timestamp);
|
||||
// 计算签名
|
||||
Map<String, String> treeMap;
|
||||
if (params instanceof TreeMap) {
|
||||
treeMap = params;
|
||||
} else {
|
||||
treeMap = new TreeMap<>(params);
|
||||
}
|
||||
StringBuilder stringBuilder = new StringBuilder();
|
||||
for (Map.Entry<String, String> entry : treeMap.entrySet()) {
|
||||
stringBuilder.append(entry.getKey()).append(entry.getValue());
|
||||
}
|
||||
Mac mac = Mac.getInstance("HmacSHA256");
|
||||
|
||||
mac.init(new SecretKeySpec(appSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));
|
||||
byte[] signData = mac.doFinal(stringBuilder.toString().getBytes(StandardCharsets.UTF_8));
|
||||
String base64String = Base64.getEncoder().encodeToString(signData);
|
||||
String signature = URLEncoder.encode(base64String, "UTF-8");
|
||||
params.put("signature", signature);
|
||||
// String responseString = doGet(
|
||||
// "https://c1.yonyoucloud.com/iuap-api-auth/open-auth/selfAppAuth/getAccessToken", params);
|
||||
String responseString = doGet(tokenUrl, params);
|
||||
Gson gson = new Gson();
|
||||
Map result = gson.fromJson(responseString, Map.class);
|
||||
|
||||
if (StringUtils.equals("00000", result.get("code").toString())) {
|
||||
|
||||
Map<String, Object> tokenInfo = (Map<String, Object>) result.get("data");
|
||||
String access_token = (String) tokenInfo.get("access_token");
|
||||
// 税务服务-调用销项发票管理-已开票-版式文件查询接口
|
||||
Map<String, Object> map = new HashMap<>();
|
||||
// 发票类型 1:增值税电子普通发票; 2:增值税电子专用发票; 3:增值税普通发票; 4:增值税专用发票 、增值税专用发票(机动车); 5:机动车销售统一发票; 8:增值税电子普通发票(成品油); 10:成品油普通发票; 11:成品油专用发票; 15:二手车销售统一发票; 31:数电专用发票; 32:数电普通发票; 33:数电纸质发票(增值税专用发票); 34:数电纸质发票(普通发票);
|
||||
map.put("fplx", headVO.getInvoice_type());
|
||||
// 数电发票号码
|
||||
map.put("slfphm", headVO.getFphm());
|
||||
// 用友自画pdf
|
||||
map.put("yypdf", "0");
|
||||
// 税局pdf
|
||||
map.put("taxpdf", "1".equals(invoiceType) ? "1" : "0");
|
||||
// 税局xml
|
||||
map.put("taxxml", "2".equals(invoiceType) ? "1" : "0");
|
||||
// 税局ofd
|
||||
map.put("taxofd", "3".equals(invoiceType) ? "1" : "0");
|
||||
// String resString = doPost(
|
||||
// "https://c1.yonyoucloud.com/iuap-api-gateway/yonbip/tax/output-tax/api/einvoice/getbsfile?access_token=" + access_token,
|
||||
// map);
|
||||
|
||||
String resString = doPost(getbsfileUrl + access_token,map);
|
||||
gson = new Gson();
|
||||
|
||||
Map resultMap = gson.fromJson(resString, Map.class);
|
||||
if (StringUtils.equals("200", resultMap.get("code").toString())) {
|
||||
Map<String, Object> infoMap = (Map<String, Object>) resultMap.get("data");
|
||||
String tax = "1".equals(invoiceType) ? (String) infoMap.get("taxpdf") : "2".equals(invoiceType) ? (String) infoMap.get("taxxml") : "3".equals(invoiceType) ? (String) infoMap.get("taxofd") : "";
|
||||
if (MMValueCheck.isEmpty(tax)) {
|
||||
throw new Exception("未查询到发票信息");
|
||||
}
|
||||
byte[] imageBytes = javax.xml.bind.DatatypeConverter.parseBase64Binary(tax);
|
||||
InputStream ins = new ByteArrayInputStream(imageBytes);
|
||||
String Fphm = headVO.getFphm();
|
||||
|
||||
//发票号码+单位名称+合同号(开票申请字段)+金额(发票上的价税合计)
|
||||
String filename = "1".equals(invoiceType) ? ".pdf" : "2".equals(invoiceType) ? ".xml" : "3".equals(invoiceType) ? ".ofd" : "";
|
||||
|
||||
|
||||
String ctcode="";
|
||||
HYSuperDMO dmo = new HYSuperDMO();
|
||||
IVApplogVO[] ivApplogVO=(IVApplogVO[]) dmo.queryByWhereClause(IVApplogVO.class, "fphm='"+Fphm+"' and dr=0 ");
|
||||
if(ivApplogVO!=null&&ivApplogVO.length>0) {
|
||||
ivApplogVO[0].getLyid();//开票申请单主键
|
||||
IVApplicationHeadVO ivApplicationHeadVO =(IVApplicationHeadVO) dmo.queryByPrimaryKey(IVApplicationHeadVO.class, ivApplogVO[0].getLyid());
|
||||
ctcode=ivApplicationHeadVO.getDef2();//合同号
|
||||
}
|
||||
//发票号码+单位名称+合同号(开票申请字段)+金额(发票上的价税合计) 合同号_单位名称_发票号码_金额
|
||||
|
||||
// 合同号_单位名称_发票号码_金额
|
||||
|
||||
String name = ctcode+"_"+headVO.getGmfmc()+"_"+Fphm+"_"+String.valueOf(headVO.getJshj().toDouble()) + filename;
|
||||
|
||||
// String name = Fphm+"_"+headVO.getGmfmc()+"_"+ctcode+"_"+String.valueOf(headVO.getJshj().toDouble()) + filename;
|
||||
file = new WebFile(name, ins);
|
||||
} else {
|
||||
throw new Exception("获取发票信息失败");
|
||||
}
|
||||
|
||||
}else {
|
||||
throw new Exception("获取access_token失败");
|
||||
}
|
||||
// String url = "";
|
||||
// IVMInvoiceHeadVO headVO = headVOList.get(0);
|
||||
//
|
||||
// if (headVOList != null && headVOList.size() > 0) {
|
||||
// url = headVO.getViewurl();
|
||||
// }
|
||||
// InputStream ins = this.ncservice.download(isdoc, url, "sscivm");
|
||||
// String Fpdm = headVO.getFpdm();
|
||||
// String Fphm = headVO.getFphm();
|
||||
// String name = headVO.getFilename();
|
||||
// String filename = ".pdf";
|
||||
// if(name!=null && name.endsWith(".ofd")){
|
||||
// filename = ".ofd";
|
||||
// }
|
||||
// file = new WebFile(Fpdm + "_" + Fphm + filename, ins);
|
||||
} catch (BusinessException e) {
|
||||
ExceptionUtils.wrappException(e);
|
||||
} catch (NoSuchAlgorithmException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (InvalidKeyException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (UnsupportedEncodingException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (IOException e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
} catch (Exception e) {
|
||||
// TODO Auto-generated catch block
|
||||
e.printStackTrace();
|
||||
}
|
||||
return file;
|
||||
}
|
||||
|
||||
|
||||
private String doPost(String requestUrl, Map<String, Object> param) throws IOException {
|
||||
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
|
||||
cm.setMaxTotal(500);
|
||||
cm.setDefaultMaxPerRoute(50);
|
||||
|
||||
RequestConfig globalConfig = RequestConfig.custom().setConnectionRequestTimeout(5000) // 连接池获取连接超时
|
||||
.setConnectTimeout(5000) // 连接建立超时
|
||||
.setSocketTimeout(20000) // 等待响应超时
|
||||
.setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();
|
||||
|
||||
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm)
|
||||
.setDefaultRequestConfig(globalConfig).build();
|
||||
HttpPost post = new HttpPost(requestUrl);
|
||||
post.setHeader("Content-Type", "application/json;charset=UTF-8");
|
||||
post.setEntity(new StringEntity(JSONObject.toJSONString(param), "utf-8"));
|
||||
String responseString = httpClient.execute(post, response -> EntityUtils.toString(response.getEntity()));
|
||||
return responseString;
|
||||
|
||||
}
|
||||
|
||||
|
||||
private String doGet(String requestUrl, Map<String, String> paramMap) throws IOException {
|
||||
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
|
||||
cm.setMaxTotal(500);
|
||||
cm.setDefaultMaxPerRoute(50);
|
||||
|
||||
RequestConfig globalConfig = RequestConfig.custom().setConnectionRequestTimeout(5000) // 连接池获取连接超时
|
||||
.setConnectTimeout(5000) // 连接建立超时
|
||||
.setSocketTimeout(20000) // 等待响应超时
|
||||
.setCookieSpec(CookieSpecs.IGNORE_COOKIES).build();
|
||||
|
||||
CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm)
|
||||
.setDefaultRequestConfig(globalConfig).build();
|
||||
StringBuilder param = new StringBuilder("?");
|
||||
if (paramMap != null) {
|
||||
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
|
||||
param.append(entry.getKey());
|
||||
param.append("=");
|
||||
param.append(entry.getValue());
|
||||
param.append("&");
|
||||
}
|
||||
param.deleteCharAt(param.length() - 1);
|
||||
}
|
||||
String url = requestUrl + param;
|
||||
HttpGet get = new HttpGet(url);
|
||||
String responseString = httpClient.execute(get, response -> EntityUtils.toString(response.getEntity()));
|
||||
get.releaseConnection();
|
||||
return responseString;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue