ecology_maven/weaver/fna/invoice/utils/InvoiceCloudUtil.java

2456 lines
130 KiB
Java
Raw Normal View History

2021-11-14 15:29:16 +08:00
package weaver.fna.invoice.utils;
import com.engine.personalIncomeTax.biz.RecordsBiz;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NTCredentials;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.params.ConnRouteParams;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import weaver.conn.RecordSet;
import weaver.fna.general.FnaCommon;
import weaver.fna.general.FnaLogSqlUtil;
import weaver.fna.invoice.Constants;
import weaver.fna.invoice.common.FnaAbstractInterface;
import weaver.fna.invoice.common.FnaInvoiceCommon;
import weaver.fna.invoice.sdk.SdkInvoiceUtil;
import weaver.general.BaseBean;
import weaver.general.GCONST;
import weaver.general.MD5;
import weaver.general.Util;
import weaver.hrm.HrmUserVarify;
import weaver.hrm.User;
import weaver.systeminfo.SystemEnv;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.math.BigInteger;
import java.net.Proxy;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* @Author: lb2018
* @Description:
* @Date: 2020/6/9 10:45
*/
public class InvoiceCloudUtil {
/**
* ocr
* @param user
* @param queryOcr
* @param queryCheck
* @param queryCloud
* @return
*/
public static JSONObject getInterfaceInfo(User user,boolean queryOcr,boolean queryCheck,boolean queryCloud){
JSONObject resultJson = new JSONObject();
RecordSet rs = new RecordSet();
if(queryOcr){
boolean existEffectOcr=false;
int imageCatalog = 0;
String interfaceurl = "";
String appKey = "";
String secret = "";
//如果有生效的未开启分部的ocr直接使用
rs.executeQuery("select * from fnainvoiceinterface where interfaceType=0 and status=1 and subIdStatus=0 ");
if(rs.next()){
imageCatalog = Util.getIntValue(rs.getString("imageCatalog"),0);
interfaceurl = Util.null2String(rs.getString("interfaceurl"));
appKey = Util.null2String(rs.getString("username"));
secret = Util.null2String(rs.getString("password"));
existEffectOcr = true;
}
if(!existEffectOcr){
//查询当前人员所在分部的ocr接口
rs.executeQuery("select * from fnainvoiceinterface where interfaceType=0 and status=1 and subIdStatus=1 ");
while (rs.next()){
String subIds = Util.null2String(rs.getString("subIds"));
String[] subIds_split = subIds.split(",");
for(int i=0;i<subIds_split.length;i++){
if(subIds_split[i].equals(String.valueOf(user.getUserSubCompany1()))){
imageCatalog = Util.getIntValue(rs.getString("imageCatalog"),0);
interfaceurl = Util.null2String(rs.getString("interfaceurl"));
appKey = Util.null2String(rs.getString("username"));
secret = Util.null2String(rs.getString("password"));
existEffectOcr = true;
break;
}
}
if(existEffectOcr){
break;
}
}
}
JSONObject ocrJson = new JSONObject();
ocrJson.put("existEffectOcr",existEffectOcr);
ocrJson.put("imageCatalog",imageCatalog);
ocrJson.put("interfaceurl",interfaceurl);
ocrJson.put("appKey",appKey);
ocrJson.put("secret",secret);
resultJson.put("ocr",ocrJson);
}
if(queryCheck){
String tokenURL = "";
String openIdURL = "";
String verifyURL = "";
String client_id = "";
String client_secret = "";
String Client = "";
String GTAXID = "";
//如果有生效的未开启分部的查验接口,直接使用
boolean existEffectCheck=false;
rs.executeQuery("select * from fnainvoiceinterface where interfaceType=1 and status=1 and subIdStatus=0 ");
if(rs.next()){
tokenURL = Util.null2String(rs.getString("tokenURL"));
openIdURL = Util.null2String(rs.getString("openIdURL"));
verifyURL = Util.null2String(rs.getString("interfaceurl"));
client_id = Util.null2String(rs.getString("client_id"));
client_secret = FnaInvoiceCommon.fnaDecrypt(Util.null2String(rs.getString("client_secret")));
Client = Util.null2String(rs.getString("Client"));
GTAXID = Util.null2String(rs.getString("GTAXID"));
existEffectCheck = true;
}
if(!existEffectCheck){
//查询当前人员所在分部的查验接口
rs.executeQuery("select * from fnainvoiceinterface where interfaceType=1 and status=1 and subIdStatus=1 ");
while (rs.next()){
String subIds = Util.null2String(rs.getString("subIds"));
String[] subIds_split = subIds.split(",");
for(int i=0;i<subIds_split.length;i++){
if(subIds_split[i].equals(String.valueOf(user.getUserSubCompany1()))){
tokenURL = Util.null2String(rs.getString("tokenURL"));
openIdURL = Util.null2String(rs.getString("openIdURL"));
verifyURL = Util.null2String(rs.getString("interfaceurl"));
client_id = Util.null2String(rs.getString("client_id"));
client_secret = FnaInvoiceCommon.fnaDecrypt(Util.null2String(rs.getString("client_secret")));
Client = Util.null2String(rs.getString("Client"));
GTAXID = Util.null2String(rs.getString("GTAXID"));
existEffectCheck = true;
break;
}
}
if(existEffectCheck){
break;
}
}
}
JSONObject checkJson = new JSONObject();
checkJson.put("existEffectCheck",existEffectCheck);
checkJson.put("tokenURL",tokenURL);
checkJson.put("openIdURL",openIdURL);
checkJson.put("verifyURL",verifyURL);
checkJson.put("client_id",client_id);
checkJson.put("client_secret",client_secret);
checkJson.put("Client",Client);
checkJson.put("GTAXID",GTAXID);
resultJson.put("check",checkJson);
}
if(queryCloud){
boolean existEffectCloud=false;//是否存在生效的发票云接口
String userName="";
String password="";
String cid="";
String jsUrl="";
String javaUrl="";
String webUrl = "";
int imageCatalog = 0;
String aesKey="";
//如果有生效的未开启分部的发票云接口,直接使用
rs.executeQuery("select * from fnainvoiceinterface where interfaceType=2 and status=1 and subIdStatus=0 ");
if(rs.next()){
cid = Util.null2String(rs.getString("cid"));
userName = Util.null2String(rs.getString("userName"));
password = FnaInvoiceCommon.fnaDecrypt(Util.null2String(rs.getString("password")));
jsUrl = Util.null2String(rs.getString("jsUrl"));
javaUrl = Util.null2String(rs.getString("javaUrl"));
webUrl = Util.null2String(rs.getString("webUrl"));
imageCatalog = Util.getIntValue(rs.getString("imageCatalog"),0);
aesKey = Util.null2String(rs.getString("aesKey"));
existEffectCloud = true;
}
if(!existEffectCloud){
//查询当前人员所在分部的发票云接口
rs.executeQuery("select * from fnainvoiceinterface where interfaceType=2 and status=1 and subIdStatus=1 ");
while (rs.next()){
String subIds = Util.null2String(rs.getString("subIds"));
String[] subIds_split = subIds.split(",");
for(int i=0;i<subIds_split.length;i++){
if(subIds_split[i].equals(String.valueOf(user.getUserSubCompany1()))){
cid = Util.null2String(rs.getString("cid"));
userName = Util.null2String(rs.getString("userName"));
password = FnaInvoiceCommon.fnaDecrypt(Util.null2String(rs.getString("password")));
jsUrl = Util.null2String(rs.getString("jsUrl"));
javaUrl = Util.null2String(rs.getString("javaUrl"));
webUrl = Util.null2String(rs.getString("webUrl"));
imageCatalog = Util.getIntValue(rs.getString("imageCatalog"),0);
aesKey = Util.null2String(rs.getString("aesKey"));
existEffectCloud = true;
break;
}
}
if(existEffectCloud){
break;
}
}
}
JSONObject cloudJson = new JSONObject();
cloudJson.put("existEffectCloud",existEffectCloud);
cloudJson.put("userName",userName);
cloudJson.put("password",password);
cloudJson.put("cid",cid);
cloudJson.put("imageCatalog",imageCatalog);
cloudJson.put("jsUrl",jsUrl);
cloudJson.put("webUrl",webUrl);
JSONObject invoiceCloudUrl = getInvoiceCloudUrl();
cloudJson.put("createCorpUrl",javaUrl+"/"+getString(invoiceCloudUrl,"createCorpUrl"));
cloudJson.put("createAppUrl",javaUrl+"/"+getString(invoiceCloudUrl,"createAppUrl"));
cloudJson.put("tokenUrl",javaUrl+"/"+getString(invoiceCloudUrl,"tokenUrl"));
cloudJson.put("synInvoiceUrl",javaUrl+"/"+getString(invoiceCloudUrl,"synInvoiceUrl"));
cloudJson.put("synBillingInfoUrl",javaUrl+"/"+getString(invoiceCloudUrl,"synBillingInfoUrl"));
cloudJson.put("synDocUrl",javaUrl+"/"+getString(invoiceCloudUrl,"synDocUrl"));
cloudJson.put("checkUrl",javaUrl+"/"+getString(invoiceCloudUrl,"checkUrl"));
cloudJson.put("ocrUrl",javaUrl+"/"+getString(invoiceCloudUrl,"ocrUrl"));
cloudJson.put("uploadFileUrl",javaUrl+"/"+getString(invoiceCloudUrl,"uploadFileUrl"));
cloudJson.put("invoiceUsedNumberInfo",javaUrl+"/"+getString(invoiceCloudUrl,"invoiceUsedNumberInfo"));
cloudJson.put("createAesKey",javaUrl+"/"+getString(invoiceCloudUrl,"createAesKey"));
cloudJson.put("reimburseUrl",javaUrl+"/"+getString(invoiceCloudUrl,"reimburseUrl"));
cloudJson.put("updateAppInfoUrl",javaUrl+"/"+getString(invoiceCloudUrl,"updateAppInfoUrl"));
cloudJson.put("localCheckUrl",javaUrl+"/"+getString(invoiceCloudUrl,"localCheckUrl"));
if("".equals(aesKey) && existEffectCloud){
if("".equals(aesKey)){
JSONObject aesKeyJson = createAesKey(cloudJson.getString("createAesKey"), password, userName);
if(!aesKeyJson.getBoolean("flag")){
new BaseBean().writeLog("createAesKey失败"+aesKeyJson.getString("msg"));
}else{
JSONObject jsonData = aesKeyJson.getJSONObject("data");
aesKey = jsonData.getString("aesSecret");
}
rs.executeUpdate("update fnainvoiceinterface set aesKey=? where cid=?",aesKey,cid);
}
}
cloudJson.put("aesKey",aesKey);
resultJson.put("cloud",cloudJson);
}
return resultJson;
}
/**
*
* @return
*/
public static JSONObject getInvoiceCloudUrl(){
RecordSet rs = new RecordSet();
JSONObject jsonObject = new JSONObject();
rs.executeQuery("select * from fnaInvoiceCloudUrl");
while (rs.next()){
String urlAddress = Util.null2String(rs.getString("urlAddress"));
String sign = Util.null2String(rs.getString("sign"));
jsonObject.put(sign,urlAddress);
}
return jsonObject;
}
/**
*
* @param user
* @return
*/
public static int getInvoicePermissions(User user){
int role=0;
//微报账,发票接口接口配置,接口使用次数查询(包括接口使用查询和票据识别查询),票据流程,发票去重校验设置,
//邮件识别发票配置,票据项对应科目设置,连号发票报销控制,票据识别失败记录查询,
//发票台账,企业台账,服务商设置,查验设置
/*String permissionArray[]={"fnaMicroReport:setting","FnaInvoiceInterface:Set","FnaInvoiceUsedtimes:Query","FnaInvoiceReset:Permissions","FnainvoiceCheckControlLogic:Set",
"FnaEmailInvoice:setting","FnaInvoiceSubject:Check","FnaSerialInvoiceControl:Set","FnaInvoiceFail:Check",
"FnaInvoiceLedger:settings","FnaInvoiceLedger:settingsAll","fnaServiceprovider:Set","fnaInvoiceCheck:Set","fnaMicroReport:setting"};*/
//使用权限:企业台账,我的票夹,接口使用次数查询,接口失败记录查询,
// 识别查验记录查询,开票信息,发票云服务商设置,发票云查验设置,发票录入设置
//预留权限 :发票统计,报销设置
//我的邮箱,勾选抵扣
String permissionArray[]={"FnaInvoiceLedger:settingsAll","FnaInvoiceLedger:settings","FnaInvoiceUsedtimes:Query","FnaInvoiceFail:Check",
"FnaInvoiceOcrCheck:Set","fnaMicroReport:setting","fnaServiceprovider:Set","fnaInvoiceCheck:Set","fnaMicroReport:setting",
"fnaEmail:setting","fnaCheckDeduction:setting"};
for(int i=0;i<permissionArray.length;i++){
boolean permission = HrmUserVarify.checkUserRight(permissionArray[i], user);
if(permission){
role = role+(int)Math.pow(2, i);
}
}
return role;
}
/**
* token
* @return
*/
public static JSONObject getCloudToken(User user,String cid,String password,String userName,String tokenurl){
JSONObject jsonObject = new JSONObject();
try{
RecordSet rs = new RecordSet();
//首先从表fnaInvoiceCloudToken中查询token,如果超过12小时重新获取
rs.executeQuery("select * from fnaInvoiceCloudToken where userId=?",user.getUID());
if(rs.next()){
String token = Util.null2String(rs.getString("token"));
long currentTimeMillis = Long.valueOf(Util.null2String(rs.getString("currentTimeMillis")));
long time = System.currentTimeMillis();
if((time-currentTimeMillis)<1800000){//接口规定大于12小时 43200000,重新获取, 这块规定10小时重新获取36000000 30分钟获取一次1800000
jsonObject.put("flag",true);
jsonObject.put("token",token);
return jsonObject;
}
}
//获取权限:
int role = getInvoicePermissions(user);
JSONObject param = new JSONObject();
param.put("cid",cid);
param.put("userId",user.getUID());
param.put("name",user.getLastname());
param.put("mobile",user.getMobile());
param.put("role",role);
String content = invoiceCloudEncode(param.toString(), password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid,Util.date(2),"OA发送请求","获取token",tokenurl,userName,password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param.toString(), "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content",content, "uuid", uuid, "string");
String token = postToUrl(tokenurl, content, map, "",uuid);
//将token存入表中
boolean existHistory=false;
rs.executeQuery("select * from fnaInvoiceCloudToken where userId=?",user.getUID());
if(rs.next()){
existHistory = true;
}
String time = Util.null2String(System.currentTimeMillis());
String updateTime = Util.date(2);
if(existHistory){//update
rs.executeUpdate("update fnaInvoiceCloudToken set cid=?,token=?,updateTime=?,currentTimeMillis=? where userId=?",
cid,token,updateTime,time,user.getUID());
}else{//insert
rs.executeUpdate("insert into fnaInvoiceCloudToken(cid,token,updateTime,currentTimeMillis,userId) values(?,?,?,?,?)",
cid,token,updateTime,time,user.getUID());
}
jsonObject.put("flag",true);
jsonObject.put("token",token);
}catch (Exception e){
jsonObject.put("flag",false);
jsonObject.put("msg",e.getMessage());
}
return jsonObject;
}
/**
* cid
* @return
*/
public static JSONObject getCloudCid(String interfaceurl,String account,String corpName,String userName,String password){
JSONObject jsonObject = new JSONObject();
try{
JSONObject param = new JSONObject();
param.put("account",account);
param.put("corpName",corpName);
String content = invoiceCloudEncode(param.toString(), password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid,Util.date(2),"OA发送请求","获取CID",interfaceurl,userName,password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param.toString(), "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content",content, "uuid", uuid, "string");
String cid = postToUrl(interfaceurl, content, map, "",uuid);
jsonObject.put("flag",true);
jsonObject.put("cid",cid);
}catch (Exception e){
jsonObject.put("flag",false);
jsonObject.put("msg",e.getMessage());
}
return jsonObject;
}
/**
*
* @return
*/
public static JSONObject updateAppInfo(String updateAppInfoUrl,String account,String oaUrl,String userName,String password){
JSONObject jsonObject = new JSONObject();
try{
JSONObject param = new JSONObject();
param.put("appName",account);
param.put("thirdAddr",oaUrl);
String content = invoiceCloudEncode(param.toString(), password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid,Util.date(2),"OA发送请求","更新应用数据",updateAppInfoUrl,userName,password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param.toString(), "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content",content, "uuid", uuid, "string");
postToUrl(updateAppInfoUrl, content, map, "",uuid);
jsonObject.put("flag",true);
}catch (Exception e){
jsonObject.put("flag",false);
jsonObject.put("msg",e.getMessage());
}
return jsonObject;
}
/**
* AppId secret
* @param interfaceurl
* @param appName
* @return
*/
public static JSONObject CreateApp(String interfaceurl,String appName,String thirdAppId,String thirdAddr){
JSONObject jsonObject = new JSONObject();
try{
JSONObject param = new JSONObject();
param.put("appName",appName);
param.put("appType",2);
param.put("thirdAppId",thirdAppId);
param.put("thirdAddr",thirdAddr);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl) values(?,?,?,?,?)",
uuid,Util.date(2),"OA发送请求","创建应用",interfaceurl);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param.toString(), "uuid", uuid, "string");
String data = postToUrl(interfaceurl, param.toString(), null, "",uuid);
jsonObject.put("flag",true);
jsonObject.put("data",data);
}catch (Exception e){
jsonObject.put("flag",false);
jsonObject.put("msg",e.getMessage());
}
return jsonObject;
}
/**
*
* @param interfaceurl
* @param param
* @param userName
* @param password
* @return
*/
public static JSONObject synBillingInfo(String interfaceurl,JSONObject param,String userName,String password){
JSONObject jsonObject = new JSONObject();
try{
String content = invoiceCloudEncode(param.toString(), password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid,Util.date(2),"OA发送请求","实时同步开票、发票信息",interfaceurl,userName,password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param.toString(), "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content",content, "uuid", uuid, "string");
String data = postToUrl(interfaceurl, content, map, "",uuid);
jsonObject.put("flag",true);
jsonObject.put("data",data);
}catch (Exception e){
jsonObject.put("flag",false);
jsonObject.put("msg",e.getMessage());
}
return jsonObject;
}
/**
* id
* @param synDocUrl
* @param cid
* @param secid
* @param userName
* @param password
* @return
*/
public static JSONObject pushSecid(String synDocUrl,String cid,String secid,String userName,String password,int userId){
JSONObject jsonObject = new JSONObject();
try{
JSONObject param = new JSONObject();
param.put("cid",cid);
param.put("secid",secid);
param.put("userId",userId);
String content = invoiceCloudEncode(param.toString(), password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid,Util.date(2),"OA发送请求","同步目录",synDocUrl,userName,password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param.toString(), "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content",content, "uuid", uuid, "string");
postToUrl(synDocUrl, content, map, "",uuid);
jsonObject.put("flag",true);
}catch (Exception e){
jsonObject.put("flag",false);
jsonObject.put("msg",e.getMessage());
}
return jsonObject;
}
/**
* json
* @param json
* @param key
* @return
*/
public static String getString(JSONObject json, String key){
if(json.containsKey(key)){
return json.getString(key);
}else{
return "";
}
}
public static String postToUrl(String url, String content,Map<String, String> headers,String xmlEncoding,String uuid,String aesKey) throws Exception {
return postToUrl(url,content,headers,xmlEncoding,uuid,"",null,aesKey);
}
public static String postToUrl(String url, String content,Map<String, String> headers,String xmlEncoding,String uuid) throws Exception {
return postToUrl(url,content,headers,xmlEncoding,uuid,"",null,"");
}
/**
*
* @param url
* @param content
* @param headers
* @param xmlEncoding
* @return
* @throws IOException
*/
public static String postToUrl(String url, String content,Map<String, String> headers,String xmlEncoding,String uuid,String from,User user,String aesKey) throws Exception {
String errorMsg="";
String data="";
if("".equals(xmlEncoding)){
xmlEncoding = "UTF-8";
}
DefaultHttpClient httpclient = null;
HttpPost httpPost = null;
try {
httpclient = new DefaultHttpClient();
if(ProxyUtil.ifExistsProxy()){
Map<String, String> proxyProperty = ProxyUtil.getProxyProperty();
String proxyUrl = proxyProperty.getOrDefault("proxyUrl","");
int proxyPort = Util.getIntValue(proxyProperty.getOrDefault("proxyPort",""),8080);
String proxyUser = proxyProperty.getOrDefault("proxyUser","");
String proxyPwd = proxyProperty.getOrDefault("proxyPwd","");
if(!"".equals(proxyUser)&&!"".equals(proxyPwd)) {
httpclient.getCredentialsProvider().setCredentials(
new AuthScope(proxyUrl, proxyPort),
new UsernamePasswordCredentials(proxyUser, proxyPwd)
);
}
HttpHost proxy = new HttpHost(proxyUrl,proxyPort);
httpclient.getParams().setParameter(ConnRouteParams.DEFAULT_PROXY,proxy);
}
httpPost = new HttpPost(url);
JSONObject response = null;
StringEntity s = new StringEntity(content, Charset.forName("UTF-8"));
httpPost.addHeader("Content-type", "application/json; charset=utf-8");
httpPost.addHeader("Accept", "application/json");
//设置超时时间
RequestConfig config = RequestConfig.custom().setConnectTimeout(130000) //连接超时时间
.setConnectionRequestTimeout(130000)
.setSocketTimeout(130000) //数据传输的超时时间
.setStaleConnectionCheckEnabled(true) //提交请求前测试连接是否可用
.build();
httpPost.setConfig(config);
httpPost.setEntity(s);
if (null != headers) {
for (Map.Entry<String, String> entry : headers.entrySet()) {
httpPost.addHeader(entry.getKey(), entry.getValue());
}
}
HttpResponse res = httpclient.execute(httpPost);
if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = res.getEntity();
String result = Util.null2String(EntityUtils.toString(res.getEntity()));
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "returnResult", result, "uuid", uuid, "string");
if ("".equals(result)) {
throw new Exception("发票云接口返回空!");
}
try {
response = JSONObject.fromObject(result);
} catch (Exception e) {
throw new Exception("发票云接口返参数json格式化异常");
}
JSONObject actionMsg = response.getJSONObject("actionMsg");
String code = actionMsg.getString("code");
if ("0".equals(code)) {//创建成功
if (response.containsKey("data")) {
data = response.getString("data");
//新接口,需要解密
if (!"".equals(aesKey) && !"".equals(data)) {
data = InvoiceCloudAESUtil.decrypt(aesKey, data);
response.put("data", data);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "returnResult", response.toString(), "uuid", uuid, "string");
}
}
} else {
errorMsg = actionMsg.getString("message");
if ("check".equals(from)) {
new BaseBean().writeLog("checkException", errorMsg);
FnaInvoiceCommon.saveFailLog(user.getUID(), 1, errorMsg);
}
throw new Exception(errorMsg);
}
} else {
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "returnResult", "请求失败HttpStatus=" + res.getStatusLine().getStatusCode(), "uuid", uuid, "string");
throw new Exception("请求失败!");
}
}catch (Exception e){
errorMsg = e.getMessage();
}finally {
if(httpclient!=null){
httpclient.close();
}
}
if(!"".equals(errorMsg)){
throw new Exception(errorMsg);
}
return data;
}
/**
*
* @param content
* @param secret
* @return
*/
public static String invoiceCloudEncode(String content,String secret){
long time = System.currentTimeMillis();
content = content+"&time="+time;
String md5Content = Md5Encode(content + "&secret=" + secret);
content = content+"&md5="+md5Content;
return content;
}
/**
*
* @param content
* @param secret
* @return
*/
public static String invoiceCloudEncode(String content,String secret,long time){
content = content+"&time="+time;
String md5Content = Md5Encode(content + "&secret=" + secret);
return md5Content;
}
/**
* md5
* @param content
* @return
*/
public static String Md5Encode(String content){
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
try {
byte[] btInput = content.getBytes("UTF-8");
// 获得MD5摘要算法的 MessageDigest 对象
MessageDigest mdInst = MessageDigest.getInstance("MD5");
// 使用指定的字节更新摘要
mdInst.update(btInput);
// 获得密文
byte[] md = mdInst.digest();
// 把密文转换成十六进制的字符串形式
int j = md.length;
char str[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* sql
* @return
*/
public static JSONArray getInvoiceInfos(String sql,int start_pos,int page_size){
DecimalFormat df = new DecimalFormat("#############################0.00");
JSONArray invoiceArray = new JSONArray();
RecordSet rs = new RecordSet();
RecordSet rs2 = new RecordSet();
RecordSet rs3 = new RecordSet();
RecordSet rs4 = new RecordSet();
String fnainvoiceledger[] = {"id","billingDate","invoiceCode","invoiceNumber","invoiceType","seller","purchaser","invoiceServiceYype",
"priceWithoutTax","taxRate","tax","taxIncludedPrice","authenticity","reimbursementDate","reimbursePerson","requestId","userid_new",
"invoiceSource_new","checkcode","status","card_id_new","encrypt_code_new","openid_new","wechatstatus","imageID","purchaserTaxNo","salesTaxNo",
"entryTime","company_seal","form_type","form_name","kind","category","imageDocId","checkStatus","updateOperate","cloudId","codeConfirm","numberConfirm","requestName",
"receiptor","reviewer","issuer","province","city","travel_tax"};
String fnainvoiceledgerdetail[]={"invoiceserviceyype","specification","unit","unitNumber2","originalUnitPrice","priceWithoutTax","taxRate","tax","startDate","endDate","numberPlate","type"};
String fnaInvoiceLedgerDtl[]={"remark","checkCodeSix","sellerAddress","purchaserAddress","salesBank","purchaserBank"};
String trainInvoice[]={"time","name","station_geton","station_getoff","train_number","seat"};
String taxiInvoice[]={"time_geton","time_getoff","mileage","place"};
String machineInvoice[]={"time","category","seller_tax_id","buyer_tax_id"};
String tollInvoice[]={"time","entrance","export"};
String carInvoice[]={"time","station_geton","station_getoff","name"};
String second_carInvoice[]={"seller_id","buyer_id","company_name","company_tax_id","license_plate","registration_number","car_code","car_model"};
String motor_VehicleInvoice[]={"machine_code","machine_number","pretax_amount","seller_tax_id","buyer_id","tax_authorities","tax_authorities_code",
"car_code","car_engine_code","car_model","certificate_number"};
String airInvoice[]={"user_name","user_id","agentcode","issue_by","fare","fuel_surcharge","caac_development_fund","insurance"};
String airDtlInvoice[]={"from_city","to_city","flight_number","airdate","airtime","seat","carrier"};
String smallInvoice[]={"storename","time","tips","currency_code","type","discount"};
String fnaDidiInvoice[]={"startDate","endDate","phone"};
String fnaDidiDtlInvoice[]={"carType","time_geton","city","station_geton","station_getoff","mileage","total"};
String fnaBoatInvoice[]={"time","station_geton","station_getoff","name","currency_code"};
//报销状况
String fnaInvoiceReimbursement[]={"requestid","reimbursementAmt","userid","reimbursementDate","requestName"};
int start=0;
rs.executeQuery(sql);
while (rs.next()){
if(start>=start_pos && page_size>0 ) {
JSONObject fnainvoiceledgerJo = new JSONObject();
int id = Util.getIntValue(rs.getString("id"), 0);
int invoiceType = Util.getIntValue(rs.getString("invoiceType"), 0);
int requestId = Util.getIntValue(rs.getString("requestId"), 0);
for (int i = 0; i < fnainvoiceledger.length; i++) {
String key = fnainvoiceledger[i];
if("requestName".equals(key)){
String requestName="";
if(requestId>0){
rs2.executeQuery("select requestName from workflow_requestBase where requestId=?",requestId);
if(rs2.next()){
requestName = Util.null2String(rs2.getString("requestName"));
}
}
fnainvoiceledgerJo.put("requestName",requestName);
}else{
fnainvoiceledgerJo.put(key, Util.null2String(rs.getString(key)));
}
}
JSONArray fnainvoiceledgerdetailJa = new JSONArray();
rs2.executeQuery("select * from fnainvoiceledgerdetail where mainid=?", id);
while (rs2.next()) {
JSONObject fnainvoiceledgerdetailJo = new JSONObject();
for (int i = 0; i < fnainvoiceledgerdetail.length; i++) {
String key = fnainvoiceledgerdetail[i];
fnainvoiceledgerdetailJo.put(key, Util.null2String(rs2.getString(key)));
}
fnainvoiceledgerdetailJa.add(fnainvoiceledgerdetailJo);
}
fnainvoiceledgerJo.put("fnainvoiceledgerdetail", fnainvoiceledgerdetailJa);
if (invoiceType == 1 || invoiceType == 2 || invoiceType == 15 || invoiceType == 16 || invoiceType == 12
|| invoiceType == 3 || invoiceType == 17 || invoiceType == 19 || invoiceType == 20 || invoiceType == 21) {
rs3.executeQuery("select * from FnaInvoiceLedgerDtl where mainid=?", id);
if (rs3.next()) {
JSONObject FnaInvoiceLedgerDtlJo = new JSONObject();
for (int i = 0; i < fnaInvoiceLedgerDtl.length; i++) {
String key = fnaInvoiceLedgerDtl[i];
FnaInvoiceLedgerDtlJo.put(key, Util.null2String(rs3.getString(key)));
}
fnainvoiceledgerJo.put("fnaInvoiceLedgerDtl", FnaInvoiceLedgerDtlJo);
}
}
if (invoiceType == 8) {//火车票
rs3.executeQuery("select * from trainInvoice where mainid=?", id);
if (rs3.next()) {
JSONObject trainInvoiceJo = new JSONObject();
for (int i = 0; i < trainInvoice.length; i++) {
String key = trainInvoice[i];
trainInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
fnainvoiceledgerJo.put("trainInvoice", trainInvoiceJo);
}
} else if (invoiceType == 7) {//出租车发票
rs3.executeQuery("select * from taxiInvoice where mainid=?", id);
if (rs3.next()) {
JSONObject taxiInvoiceJo = new JSONObject();
for (int i = 0; i < taxiInvoice.length; i++) {
String key = taxiInvoice[i];
taxiInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
fnainvoiceledgerJo.put("taxiInvoice", taxiInvoiceJo);
}
} else if (invoiceType == 3) {//通用机打发票
rs3.executeQuery("select * from machineInvoice where mainid=?", id);
if (rs3.next()) {
JSONObject machineInvoiceJo = new JSONObject();
for (int i = 0; i < machineInvoice.length; i++) {
String key = machineInvoice[i];
machineInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
fnainvoiceledgerJo.put("machineInvoice", machineInvoiceJo);
}
} else if (invoiceType == 9) {//过路费发票表
rs3.executeQuery("select * from tollInvoice where mainid=?", id);
if (rs3.next()) {
JSONObject tollInvoiceJo = new JSONObject();
for (int i = 0; i < tollInvoice.length; i++) {
String key = tollInvoice[i];
tollInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
fnainvoiceledgerJo.put("tollInvoice", tollInvoiceJo);
}
} else if (invoiceType == 10) {//客运汽车发票
rs3.executeQuery("select * from carInvoice where mainid=?", id);
if (rs3.next()) {
JSONObject carInvoiceJo = new JSONObject();
for (int i = 0; i < carInvoice.length; i++) {
String key = carInvoice[i];
carInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
fnainvoiceledgerJo.put("carInvoice", carInvoiceJo);
}
} else if (invoiceType == 11) {//二手车销售统一发票表
rs3.executeQuery("select * from second_carInvoice where mainid=?", id);
if (rs3.next()) {
JSONObject second_carInvoiceJo = new JSONObject();
for (int i = 0; i < second_carInvoice.length; i++) {
String key = second_carInvoice[i];
second_carInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
fnainvoiceledgerJo.put("second_carInvoice", second_carInvoiceJo);
}
} else if (invoiceType == 12) {//机动车销售统一发票
rs3.executeQuery("select * from motor_VehicleInvoice where mainid=?", id);
if (rs3.next()) {
JSONObject motor_VehicleInvoiceJo = new JSONObject();
for (int i = 0; i < motor_VehicleInvoice.length; i++) {
String key = motor_VehicleInvoice[i];
motor_VehicleInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
fnainvoiceledgerJo.put("motor_VehicleInvoice", motor_VehicleInvoiceJo);
}
} else if (invoiceType == 14) {//航空运输电子客票行程单
rs3.executeQuery("select * from airInvoice where mainid=?", id);
if (rs3.next()) {
JSONObject airInvoiceJo = new JSONObject();
for (int i = 0; i < airInvoice.length; i++) {
String key = airInvoice[i];
airInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
fnainvoiceledgerJo.put("airInvoice", airInvoiceJo);
}
rs3.executeQuery("select * from airDtlInvoice where mainid=?", id);
JSONArray airDtlInvoiceJa = new JSONArray();
while (rs3.next()) {
JSONObject airDtlInvoiceJo = new JSONObject();
for (int i = 0; i < airDtlInvoice.length; i++) {
String key = airDtlInvoice[i];
airDtlInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
airDtlInvoiceJa.add(airDtlInvoiceJo);
}
fnainvoiceledgerJo.put("airDtlInvoice", airDtlInvoiceJa);
} else if (invoiceType == 13) {//国际小票
rs3.executeQuery("select * from smallInvoice where mainid=?", id);
if (rs3.next()) {
JSONObject smallInvoiceJo = new JSONObject();
for (int i = 0; i < smallInvoice.length; i++) {
String key = smallInvoice[i];
smallInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
fnainvoiceledgerJo.put("smallInvoice", smallInvoiceJo);
}
} else if (invoiceType == 22) {//滴滴出行行程单
rs3.executeQuery("select * from fnaDidiInvoice where mainid=?", id);
if (rs3.next()) {
JSONObject fnaDidiInvoiceJo = new JSONObject();
for (int i = 0; i < fnaDidiInvoice.length; i++) {
String key = fnaDidiInvoice[i];
fnaDidiInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
fnainvoiceledgerJo.put("fnaDidiInvoice", fnaDidiInvoice);
}
rs3.executeQuery("select * from fnaDidiDtlInvoice where mainid=?", id);
JSONArray fnaDidiDtlInvoiceJa = new JSONArray();
while (rs3.next()) {
JSONObject fnaDidiDtlInvoiceJo = new JSONObject();
for (int i = 0; i < fnaDidiDtlInvoice.length; i++) {
String key = fnaDidiDtlInvoice[i];
fnaDidiDtlInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
fnaDidiDtlInvoiceJa.add(fnaDidiDtlInvoiceJo);
}
fnainvoiceledgerJo.put("fnaDidiDtlInvoice", fnaDidiDtlInvoiceJa);
} else if (invoiceType == 23) {//船票
rs3.executeQuery("select * from fnaBoatInvoice where mainid=?", id);
if (rs3.next()) {
JSONObject fnaBoatInvoiceJo = new JSONObject();
for (int i = 0; i < fnaBoatInvoice.length; i++) {
String key = fnaBoatInvoice[i];
fnaBoatInvoiceJo.put(key, Util.null2String(rs3.getString(key)));
}
fnainvoiceledgerJo.put("fnaBoatInvoice", fnaBoatInvoiceJo);
}
}
JSONArray fnaInvoiceReimbursementJa = new JSONArray();
rs3.executeQuery("select * from fnaInvoiceReimbursement where mainid=?", id);
while (rs3.next()) {
int requestid3 = Util.getIntValue(rs3.getString("requestId"),0);
JSONObject fnaInvoiceReimbursementJo = new JSONObject();
for (int i = 0; i < fnaInvoiceReimbursement.length; i++) {
String key = fnaInvoiceReimbursement[i];
if("requestName".equals(key)){
String requestName="";
if(requestid3>0){
rs4.executeQuery("select requestName from workflow_requestBase where requestId=?",requestid3);
if(rs4.next()){
requestName = Util.null2String(rs4.getString("requestName"));
}
}
fnaInvoiceReimbursementJo.put("requestName",requestName);
}else{
fnaInvoiceReimbursementJo.put(key, Util.null2String(rs3.getString(key)));
}
}
fnaInvoiceReimbursementJa.add(fnaInvoiceReimbursementJo);
}
fnainvoiceledgerJo.put("fnaInvoiceReimbursement", fnaInvoiceReimbursementJa);
invoiceArray.add(fnainvoiceledgerJo);
page_size--;
}
start++;
}
return invoiceArray;
}
/**
*
* @param infoJson
* @return cloudIdid
*/
public static JSONObject updateInvoiceInfo(JSONObject infoJson,String ipAdress) throws Exception {
JSONObject jsonObject = new JSONObject();
String fnainvoiceledger[] = {"billingDate","invoiceCode","invoiceNumber","invoiceType","seller","purchaser","invoiceServiceYype",
"priceWithoutTax","taxRate","tax","taxIncludedPrice","authenticity","userid_new",//"reimbursementDate","reimbursePerson","requestId" 报销信息无需从发票云获取
"invoiceSource_new","checkcode","status","card_id_new","encrypt_code_new","openid_new","wechatstatus","imageID","purchaserTaxNo","salesTaxNo",
"entryTime","company_seal","form_type","form_name","kind","category","imageDocId","checkStatus","updateOperate","cloudId","codeConfirm","numberConfirm",
"receiptor","reviewer","issuer","province","city","travel_tax"};
String fnainvoiceledgerdetail[]={"invoiceserviceyype","specification","unit","unitNumber2","originalUnitPrice","priceWithoutTax","taxRate","tax","startDate","endDate","numberPlate","type"};
String fnaInvoiceLedgerDtl[]={"remark","checkCodeSix","sellerAddress","purchaserAddress","salesBank","purchaserBank"};
String trainInvoice[]={"time","name","station_geton","station_getoff","train_number","seat"};
String taxiInvoice[]={"time_geton","time_getoff","mileage","place"};
String machineInvoice[]={"time","category","seller_tax_id","buyer_tax_id"};
String tollInvoice[]={"time","entrance","export"};
String carInvoice[]={"time","station_geton","station_getoff","name"};
String second_carInvoice[]={"seller_id","buyer_id","company_name","company_tax_id","license_plate","registration_number","car_code","car_model"};
String motor_VehicleInvoice[]={"machine_code","machine_number","pretax_amount","seller_tax_id","buyer_id","tax_authorities","tax_authorities_code",
"car_code","car_engine_code","car_model","certificate_number"};
String airInvoice[]={"user_name","user_id","agentcode","issue_by","fare","fuel_surcharge","caac_development_fund","insurance"};
String airDtlInvoice[]={"from_city","to_city","flight_number","airdate","airtime","seat","carrier"};
String smallInvoice[]={"storename","time","tips","currency_code","type","discount"};
String fnaDidiInvoice[]={"startDate","endDate","phone"};
String fnaDidiDtlInvoice[]={"carType","time_geton","city","station_geton","station_getoff","mileage","total"};
String fnaBoatInvoice[]={"time","station_geton","station_getoff","name","currency_code"};
String formatDoubleColumn="priceWithoutTax,taxRate,tax,taxIncludedPrice,mileage,pretax_amount,travel_tax,total";//需要格式化金额的列,用逗号隔开
List<String> formatDoubleList = Arrays.asList(formatDoubleColumn.split(","));
String formatIntColumn="invoiceType,authenticity,reimbursePerson,requestId,userid_new,invoiceSource_new," +
"status,imageID,company_seal,imageDocId,checkStatus,updateOperate";
List<String> formatIntList = Arrays.asList(formatIntColumn.split(","));
int id = Util.getIntValue(infoJson.getString("id"),0);
String cloudId= Util.null2String(infoJson.getString("cloudId"));
int invoiceType = Util.getIntValue(infoJson.getString("invoiceType"),0);
int userid_new = Util.getIntValue(infoJson.getString("userid_new"),0);
String invoiceNumber= Util.null2String(infoJson.getString("invoiceNumber"));
String invoiceCode= Util.null2String(infoJson.getString("invoiceCode"));
RecordSet rs = new RecordSet();
List<String>valueList =new ArrayList<String>();
//脏数据优化
if(id==0){
rs.executeQuery("select id from fnainvoiceLedger where invoicenumber=? and invoiceCode=?",invoiceNumber,invoiceCode);
if(rs.next()){
id = Util.getIntValue(rs.getString("id"),0);
}
}else{
//判断该id在台账中是否存在
int cnt = 0;
rs.executeQuery("select count(id) cnt from fnainvoiceLedger where id=?",id);
if(rs.next()){
cnt= Util.getIntValue(rs.getString("cnt"),0);
}
if(cnt==0){
id=0;
}
}
synchronized(InvoiceCloudUtil.class) {
//插入日志1
FnaLogSqlUtil fnaLogSqlUtil = new FnaLogSqlUtil();
Map<String, String> labelIdMap = new HashMap<String, String>();
Map<String, String> beforeMap = new HashMap<String, String>();
String opType="0";
if(id>0){
opType="2";
beforeMap = fnaLogSqlUtil.getInvoiceMap(String.valueOf(id),labelIdMap);
}
//修改主表数据 fnainvoiceledger
String sql = getsqlByColumn(id, fnainvoiceledger, infoJson, valueList, formatDoubleList,formatIntList,"fnainvoiceledger");
rs.executeUpdate(sql,valueList);
if(id<=0){
rs.executeQuery("select id from fnainvoiceledger where cloudId=?",cloudId);
if(rs.next()){
id = Util.getIntValue(rs.getString("id"));
}
}
//修改明细表数据 fnainvoiceledgerdetail
rs.executeUpdate("delete from fnainvoiceledgerdetail where mainid=?", id);
if (infoJson.containsKey("fnainvoiceledgerdetail")) {
String fnainvoiceledgerdetailStr = infoJson.getString("fnainvoiceledgerdetail");
if (fnainvoiceledgerdetailStr != null && !"".equals(fnainvoiceledgerdetailStr)) {
JSONArray infoJsonArray = infoJson.getJSONArray("fnainvoiceledgerdetail");
for (int i = 0; i < infoJsonArray.size(); i++) {
JSONObject infoJsonDtl = infoJsonArray.getJSONObject(i);
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, fnainvoiceledgerdetail, infoJsonDtl, valueList, formatDoubleList, formatIntList, "fnainvoiceledgerdetail");
rs.executeUpdate(sql, valueList);
}
}
}
}
if (invoiceType == 1 || invoiceType == 2 || invoiceType == 15 || invoiceType == 16 || invoiceType == 12
|| invoiceType == 3 || invoiceType == 17 || invoiceType == 19 || invoiceType == 20 || invoiceType == 21) {
//修改明细表数据 fnaInvoiceLedgerDtl
rs.executeUpdate("delete from fnaInvoiceLedgerDtl where mainid=?", id);
if (infoJson.containsKey("fnaInvoiceLedgerDtl")) {
JSONObject infoJsonDtl = infoJson.getJSONObject("fnaInvoiceLedgerDtl");
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, fnaInvoiceLedgerDtl, infoJsonDtl, valueList, formatDoubleList, formatIntList, "fnaInvoiceLedgerDtl");
rs.executeUpdate(sql, valueList);
}
}
}
if (invoiceType == 8) {//火车票
//修改明细表数据 trainInvoice
rs.executeUpdate("delete from trainInvoice where mainid=?", id);
if (infoJson.containsKey("trainInvoice")) {
JSONObject infoJsonDtl = infoJson.getJSONObject("trainInvoice");
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, trainInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "trainInvoice");
rs.executeUpdate(sql, valueList);
}
}
} else if (invoiceType == 7) {//出租车发票
//修改明细表数据 taxiInvoice
rs.executeUpdate("delete from taxiInvoice where mainid=?", id);
if (infoJson.containsKey("taxiInvoice")) {
JSONObject infoJsonDtl = infoJson.getJSONObject("taxiInvoice");
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, taxiInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "taxiInvoice");
rs.executeUpdate(sql, valueList);
}
}
} else if (invoiceType == 3) {//通用机打发票
//修改明细表数据 machineInvoice
rs.executeUpdate("delete from machineInvoice where mainid=?", id);
if (infoJson.containsKey("machineInvoice")) {
JSONObject infoJsonDtl = infoJson.getJSONObject("machineInvoice");
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, machineInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "machineInvoice");
rs.executeUpdate(sql, valueList);
}
}
} else if (invoiceType == 9) {//过路费发票表
//修改明细表数据 tollInvoice
rs.executeUpdate("delete from tollInvoice where mainid=?", id);
if (infoJson.containsKey("tollInvoice")) {
JSONObject infoJsonDtl = infoJson.getJSONObject("tollInvoice");
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, tollInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "tollInvoice");
rs.executeUpdate(sql, valueList);
}
}
} else if (invoiceType == 10) {//客运汽车发票
//修改明细表数据 carInvoice
rs.executeUpdate("delete from carInvoice where mainid=?", id);
if (infoJson.containsKey("carInvoice")) {
JSONObject infoJsonDtl = infoJson.getJSONObject("carInvoice");
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, carInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "carInvoice");
rs.executeUpdate(sql, valueList);
}
}
} else if (invoiceType == 11) {//二手车销售统一发票表
//修改明细表数据 second_carInvoice
rs.executeUpdate("delete from second_carInvoice where mainid=?", id);
if (infoJson.containsKey("second_carInvoice")) {
JSONObject infoJsonDtl = infoJson.getJSONObject("second_carInvoice");
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, second_carInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "second_carInvoice");
rs.executeUpdate(sql, valueList);
}
}
} else if (invoiceType == 12) {//机动车销售统一发票
//修改明细表数据 motor_VehicleInvoice
rs.executeUpdate("delete from motor_VehicleInvoice where mainid=?", id);
if (infoJson.containsKey("motor_VehicleInvoice")) {
JSONObject infoJsonDtl = infoJson.getJSONObject("motor_VehicleInvoice");
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, motor_VehicleInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "motor_VehicleInvoice");
rs.executeUpdate(sql, valueList);
}
}
} else if (invoiceType == 14) {//航空运输电子客票行程单
//修改明细表数据 airInvoice
rs.executeUpdate("delete from airInvoice where mainid=?", id);
if (infoJson.containsKey("airInvoice")) {
JSONObject infoJsonDtl = infoJson.getJSONObject("airInvoice");
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, airInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "airInvoice");
rs.executeUpdate(sql, valueList);
}
}
rs.executeUpdate("delete from airDtlInvoice where mainid=?", id);
if (infoJson.containsKey("airDtlInvoice")) {
String airDtlInvoiceStr = infoJson.getString("airDtlInvoice");
if (airDtlInvoiceStr != null && !"".equals(airDtlInvoiceStr)) {
JSONArray infoJsonArray = infoJson.getJSONArray("airDtlInvoice");
for (int i = 0; i < infoJsonArray.size(); i++) {
JSONObject infoJsonDtl = infoJsonArray.getJSONObject(i);
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, airDtlInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "airDtlInvoice");
rs.executeUpdate(sql, valueList);
}
}
}
}
} else if (invoiceType == 13) {//国际小票
//修改明细表数据 smallInvoice
rs.executeUpdate("delete from smallInvoice where mainid=?", id);
if (infoJson.containsKey("smallInvoice")) {
JSONObject infoJsonDtl = infoJson.getJSONObject("smallInvoice");
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, smallInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "smallInvoice");
rs.executeUpdate(sql, valueList);
}
}
} else if (invoiceType == 22) {//船票
//修改明细表数据 fnaBoatInvoice
rs.executeUpdate("delete from fnaBoatInvoice where mainid=?", id);
if (infoJson.containsKey("fnaBoatInvoice")) {
JSONObject infoJsonDtl = infoJson.getJSONObject("fnaBoatInvoice");
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, fnaBoatInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "fnaBoatInvoice");
rs.executeUpdate(sql, valueList);
}
}
} else if (invoiceType == 23) {//滴滴出行行程单
//修改明细表数据 fnaDidiInvoice
rs.executeUpdate("delete from fnaDidiInvoice where mainid=?", id);
if (infoJson.containsKey("fnaDidiInvoice")) {
JSONObject infoJsonDtl = infoJson.getJSONObject("fnaDidiInvoice");
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, fnaDidiInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "fnaDidiInvoice");
rs.executeUpdate(sql, valueList);
}
}
rs.executeUpdate("delete from fnaDidiDtlInvoice where mainid=?", id);
if (infoJson.containsKey("fnaDidiDtlInvoice")) {
String fnaDidiDtlInvoiceStr = infoJson.getString("fnaDidiDtlInvoice");
if (fnaDidiDtlInvoiceStr != null && !"".equals(fnaDidiDtlInvoiceStr)) {
JSONArray infoJsonArray = infoJson.getJSONArray("fnaDidiDtlInvoice");
for (int i = 0; i < infoJsonArray.size(); i++) {
JSONObject infoJsonDtl = infoJsonArray.getJSONObject(i);
if (infoJsonDtl != null && infoJsonDtl.size() > 0) {
sql = getsqlByColumn(id, fnaDidiDtlInvoice, infoJsonDtl, valueList, formatDoubleList, formatIntList, "fnaDidiDtlInvoice");
rs.executeUpdate(sql, valueList);
}
}
}
}
}
//插入日志2
Map<String, String> afterMap = fnaLogSqlUtil.getInvoiceMap(String.valueOf(id), labelIdMap);
fnaLogSqlUtil.invoiceLedgerAddlog(new User(1), ipAdress, opType, String.valueOf(id), "2",
beforeMap, afterMap, labelIdMap);
}
jsonObject.put("id",String.valueOf(id));
jsonObject.put("cloudId",cloudId);
return jsonObject;
}
/**
* sql
* @return
*/
public static String getsqlByColumn(int id,String tableNameArray[] ,JSONObject infoJson,List<String>valueList,
List<String> formatDoubleList,List<String> formatIntList,String tableName){
DecimalFormat df = new DecimalFormat("###############################0.00");
StringBuffer sql=new StringBuffer();
StringBuffer sqlPlaceHolder=new StringBuffer();
valueList.clear();
if(id<=0 || !"fnainvoiceledger".equals(tableName)){
sql.append("insert into ").append(tableName).append("(");
sqlPlaceHolder.append(" values(");
if(!"fnainvoiceledger".equals(tableName)){//明细表插入mainid
sql.append("mainid,");
sqlPlaceHolder.append("?,");
valueList.add(String.valueOf(id));
}
for(int i=0;i<tableNameArray.length;i++){
String column=tableNameArray[i];
sql.append(column);
sqlPlaceHolder.append("?");
if(i!=(tableNameArray.length-1)){
sql.append(",");
sqlPlaceHolder.append(",");
}else{
sql.append(")");
sqlPlaceHolder.append(")");
}
if(formatDoubleList.contains(column)) {
valueList.add(df.format(Util.getDoubleValue(getString(infoJson,column), 0.00)));
}else if(formatIntList.contains(column)){
valueList.add(Util.null2String(Util.getIntValue(getString(infoJson,column),0)));
}else{
valueList.add(getString(infoJson,column));
}
}
}else{
sql.append("update ").append(tableName).append(" set ");
for(int i=0;i<tableNameArray.length;i++){
String column=tableNameArray[i];
sql.append(" ").append(column).append("=?");
if(i!=(tableNameArray.length-1)){
sql.append(",");
}
if(formatDoubleList.contains(column)){
valueList.add(df.format(Util.getDoubleValue(getString(infoJson,column),0.00)));
}else if(formatIntList.contains(column)){
valueList.add(Util.null2String(Util.getIntValue(getString(infoJson,column),0)));
}else{
valueList.add(getString(infoJson,column));
}
}
sql.append(" where id=?");
valueList.add(String.valueOf(id));
}
return sql.toString()+sqlPlaceHolder.toString();
}
/**
* TODO
*
* @param imageBytes
* @param filePath
* @return
*/
public static File getFileFromBytes(byte[] imageBytes, String filePath) {
BufferedOutputStream stream = null;
File file = null;
try {
file = new File(filePath);
file.mkdirs();
if (file.exists()) {
file.delete();
file.createNewFile();
} else {
file.createNewFile();
}
FileOutputStream fstream = new FileOutputStream(file);
stream = new BufferedOutputStream(fstream);
stream.write(imageBytes);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
return file;
}
public static String getImageId(byte[] imageBytes, String cid, String tokenUrl,String uploadUrl,User user, String userName, String password) throws Exception {
//获取token
JSONObject tokenJson = getCloudToken(user,cid,password,userName,tokenUrl);
String token = "";
if(tokenJson.getBoolean("flag")){
token = tokenJson.getString("token");
}else{
throw new Exception(tokenJson.getString("msg"));
}
uploadUrl = uploadUrl+"?token="+token;
String imageId = "";
//获取图片路径
String filePath = GCONST.getRootPath() +
"WEB-INF" + File.separatorChar +
"fna" + File.separatorChar +
"fpyOCRImageTemp" + File.separatorChar +
FnaCommon.getPrimaryKeyGuid1();
File imageFile = getFileFromBytes(imageBytes, filePath);
try {
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid, Util.date(2), "OA发送请求", "发票识别-发票云-上传文件", uploadUrl, userName, password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", "", "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content", "", "uuid", uuid, "string");
JSONObject data = uploadPicture(imageFile, uploadUrl);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "returnResult", data.toString(), "uuid", uuid, "string");
new BaseBean().writeLog("--------fnaLog--------发票云-文件上传返回data" + data);
if(data.getString("status").equals("0")){
JSONObject json = data.getJSONObject("returnInfo");
JSONObject actionMsgJson = json.getJSONObject("actionMsg");
if (!"0".equals(actionMsgJson.getString("code"))) {
throw new Exception(actionMsgJson.getString("message"));
}
JSONObject dataJson = json.getJSONObject("data");
imageId = Util.null2String(dataJson.getString("id"));
}
} finally {
//识别完成,删掉临时图片文件
File tempImagefile = new File(filePath);
if (tempImagefile.exists()) {
tempImagefile.delete();
}
}
return imageId;
}
/**
* OCR
*
* @param cid
* @param checkUrl
* @param user
* @return
*/
public static JSONObject invoiceOCR(byte[] imageBytes, String cid, String ocrUrl,String tokenUrl,String uploadUrl, User user, String userName, String password) throws Exception {
DecimalFormat df = new DecimalFormat("############################0.00");
JSONObject resultJsonObj = new JSONObject();
//1.先上传图片获取图片id
String imageId = getImageId(imageBytes,cid,tokenUrl,uploadUrl,user, userName, password);
//2.调用发票识别接口
//传入的参数
JSONObject param = new JSONObject();
param.put("cid", cid);
param.put("userId", user.getUID());
param.put("image_index", imageId);
param.put("operate_type", "1");
param.put("is_save", "1");
//通信
String content = invoiceCloudEncode(param.toString(), password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid, Util.date(2), "OA发送请求", "发票识别-发票云", ocrUrl, userName, password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param.toString(), "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content", content, "uuid", uuid, "string");
String data = postToUrl(ocrUrl, content, map, "", uuid, "check", user,"");
new BaseBean().writeLog("--------fnaLog--------发票云返回data" + data);
JSONObject dataJson = JSONObject.fromObject(data);
//解析报文开始
JSONObject dataJsonObj = new JSONObject(); //封装的接口返回标准信息
JSONArray identify_results = new JSONArray(); //识别结果数据
JSONArray infoArrayJson = dataJson.getJSONArray("infos");
int infoArrayJson_len = infoArrayJson.size();
for (int i = 0; i < infoArrayJson_len; i++) {
JSONObject infoArrayJsonElt = infoArrayJson.getJSONObject(i);
String ret = infoArrayJsonElt.getString("ret");
if ("0".equals(ret)) {
//获取发票云相关信息对象
JSONObject infoJson = infoArrayJsonElt.getJSONObject("info");
JSONObject modify_infoJson = infoJson.getJSONObject("modify_info");
JSONObject comm_infoJson = infoJson.getJSONObject("comm_info");
JSONObject proJson = comm_infoJson.getJSONObject("pro");
JSONObject priceJson = comm_infoJson.getJSONObject("price");
JSONObject buyerJson = comm_infoJson.getJSONObject("buyer");
JSONObject payerJson = comm_infoJson.getJSONObject("payer");
//不常用信息
String ext = infoJson.getString("ext");
JSONObject extJson = JSONObject.fromObject(ext);
//转化为标准的结构
JSONObject identifyObj = new JSONObject();
JSONObject detailsObj = new JSONObject();
String type = proJson.getString("type");
String standardType =Constants.STANDARDTYPE.get(type);
if ("".equals(standardType)) {
//识别失败
resultJsonObj.put("result", 0);
resultJsonObj.put("message", "发票识别失败!");
return resultJsonObj;
}
identifyObj.put("type", standardType);
identifyObj.put("orientation", "");
identifyObj.put("region", infoJson.getString("region"));
if ("1".equals(type) || "2".equals(type) || "3".equals(type) || "4".equals(type) || "5".equals(type) || "22".equals(type) || "28".equals(type) ) { //增值税
//if ("1".equals(type) || "2".equals(type) || "3".equals(type) || "5".equals(type)) { //增值税
detailsObj.put("code", getString(infoJson, "code"));
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("pretax_amount", getString(priceJson, "amount"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("tax", getString(extJson, "ttax"));
detailsObj.put("check_code", getString(proJson, "chcode"));
detailsObj.put("seller", getString(payerJson, "company"));
detailsObj.put("seller_tax_id", getString(payerJson, "tcode"));
detailsObj.put("buyer", getString(buyerJson, "company"));
detailsObj.put("buyer_tax_id", getString(buyerJson, "tcode"));
detailsObj.put("company_seal", getString(extJson, "corp_seal"));
detailsObj.put("form_type", getString(extJson, "form_type"));
detailsObj.put("form_name", getString(extJson, "form_name"));
detailsObj.put("kind", getString(proJson, "kind"));
detailsObj.put("ciphertext", getString(extJson, "ciphertext"));
detailsObj.put("transit_mark", getString(extJson, "transit"));
detailsObj.put("oil_mark", getString(extJson, "oil_mark"));
detailsObj.put("machine_code", getString(extJson, "machine_code"));
detailsObj.put("travel_tax", getString(extJson, "travel_tax"));
detailsObj.put("receiptor", getString(extJson, "receiptor"));
detailsObj.put("reviewer", getString(extJson, "reviewer"));
detailsObj.put("issuer", getString(extJson, "issuer"));
detailsObj.put("province", getString(extJson, "province"));
detailsObj.put("city", getString(extJson, "city"));
detailsObj.put("service_name", getString(extJson, "service_name"));
detailsObj.put("remark", getString(extJson, "comment"));
detailsObj.put("code_confirm", getString(extJson, "code_confirm"));
detailsObj.put("number_confirm", getString(extJson, "number_confirm"));
String item_names = "";
if(extJson.containsKey("products")) {
JSONArray productsArrayJson = extJson.getJSONArray("products");
for (int j = 0; j < productsArrayJson.size(); j++) {
if (!"".equals(item_names)) {
item_names += ",";
}
item_names += productsArrayJson.getJSONObject(j).get("name");
}
}
detailsObj.put("item_names", item_names);
detailsObj.put("agent_mark", getString(extJson, "agent_mark"));
detailsObj.put("acquisition_mark", getString(extJson, "acquisition"));
detailsObj.put("block_chain", getString(extJson, "block_chain"));
if("22".equals(type)){//区块链发票
detailsObj.put("block_chain", "1");
}
if("5".equals(type)){//通行费
detailsObj.put("transit_mark", "1");
}
detailsObj.put("code_confirm", getString(extJson, "code_confirm"));
detailsObj.put("number_confirm", getString(extJson, "number_confirm"));
JSONArray items = new JSONArray();//发票明细
if(extJson.containsKey("products")){
JSONArray productsArray = extJson.getJSONArray("products");
for(int j=0;j<productsArray.size();j++){
JSONObject productJson = productsArray.getJSONObject(j);
String CommodityName = getString(productJson,"name");
String UnitPrice = getString(productJson,"price");
String Quantity = getString(productJson,"qty");
String specification = getString(productJson,"smodel");
String unit = getString(productJson,"muint");
String Amount = getString(productJson,"amount");
String TaxRate = String.valueOf(Util.getDoubleValue(getString(productJson,"trate"),0.00)/100);
String Tax = getString(productJson,"tprice");
String startDate = getString(productJson,"txrqq");
String endDate = getString(productJson,"txrqz");
String numberPlate = getString(productJson,"txfCph");
String carType = getString(productJson,"txfLx");
JSONObject jsonItems = new JSONObject();
jsonItems.put("quantity", Quantity);
jsonItems.put("price", UnitPrice);
jsonItems.put("name", CommodityName);
jsonItems.put("total", Amount);
jsonItems.put("tax_rate", TaxRate);
jsonItems.put("tax", Tax);
jsonItems.put("specification", specification);
jsonItems.put("unit", unit);
jsonItems.put("startDate", startDate);
jsonItems.put("endDate", endDate);
jsonItems.put("numberPlate", numberPlate);
jsonItems.put("type", carType);
items.add(jsonItems);
}
}
detailsObj.put("items", items);
} else if ("9".equals(type)) { //出租车
detailsObj.put("code", getString(infoJson, "code"));
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("time_geton", getString(extJson, "time_geton"));
detailsObj.put("time_getoff", getString(extJson, "time_getoff"));
detailsObj.put("mileage", getString(extJson, "mileage"));
detailsObj.put("fare", getString(extJson, "fare"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("place", getString(extJson, "place"));
detailsObj.put("kind", getString(proJson, "kind"));
detailsObj.put("province", getString(extJson, "province"));
detailsObj.put("city", getString(extJson, "city"));
detailsObj.put("license_plate", getString(extJson, "license_plate"));
} else if ("12".equals(type)) { //火车票
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("time", getString(extJson, "time"));
detailsObj.put("name", getString(extJson, "name"));
detailsObj.put("station_geton", getString(extJson, "station_geton"));
detailsObj.put("station_getoff", getString(extJson, "station_getoff"));
detailsObj.put("train_number", getString(extJson, "train_number"));
detailsObj.put("seat", getString(extJson, "seat"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("kind", getString(proJson, "kind"));
detailsObj.put("serial_number", getString(extJson, "serial_number"));
detailsObj.put("user_id", getString(extJson, "user_id"));
} else if ("10".equals(type)) { //机打发票
detailsObj.put("code", getString(infoJson, "code"));
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("time", getString(extJson, "time"));
detailsObj.put("check_code", getString(proJson, "chcode"));
detailsObj.put("category", getString(extJson, "category"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("seller", getString(payerJson, "company"));
detailsObj.put("seller_tax_id", getString(payerJson, "tcode"));
detailsObj.put("buyer", getString(buyerJson, "company"));
detailsObj.put("buyer_tax_id", getString(buyerJson, "tcode"));
detailsObj.put("kind", getString(proJson, "kind"));
detailsObj.put("province", getString(extJson, "province"));
detailsObj.put("city", getString(extJson, "city"));
detailsObj.put("company_seal", getString(extJson, "companySeal"));
} else if ("8".equals(type)) { //定额发票
detailsObj.put("code", getString(infoJson, "code"));
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("kind", getString(proJson, "kind"));
detailsObj.put("province", getString(extJson, "province"));
detailsObj.put("city", getString(extJson, "city"));
detailsObj.put("company_seal", getString(extJson, "companySeal"));
} else if ("13".equals(type)) { //过路费
detailsObj.put("code", getString(infoJson, "code"));
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("time", getString(extJson, "time"));
detailsObj.put("entrance", getString(extJson, "entrance"));
detailsObj.put("exit", getString(extJson, "exit"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("kind", getString(proJson, "kind"));
detailsObj.put("highway_flag", getString(extJson, "highway_flag"));
} else if ("15".equals(type)) { //客运汽车
detailsObj.put("code", getString(infoJson, "code"));
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("time", getString(extJson, "time"));
detailsObj.put("station_geton", getString(extJson, "station_geton"));
detailsObj.put("station_getoff", getString(extJson, "station_getoff"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("name", getString(extJson, "name"));
detailsObj.put("kind", getString(proJson, "kind"));
detailsObj.put("user_id", getString(extJson, "user_id"));
} else if ("16".equals(type)) { //航空运输电子客票行程单
detailsObj.put("user_name", getString(extJson, "user_name"));
detailsObj.put("user_id", getString(extJson, "user_id"));
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("check_code", getString(proJson, "chcode"));
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("agentcode", getString(extJson, "agentcode"));
detailsObj.put("issue_by", getString(extJson, "issue_by"));
detailsObj.put("fare", getString(extJson, "fare"));
detailsObj.put("tax", getString(extJson, "tax"));
detailsObj.put("fuel_surcharge", getString(extJson, "fuel_surcharge"));
detailsObj.put("caac_development_fund", getString(extJson, "caac_development_fund"));
detailsObj.put("insurance", getString(extJson, "insurance"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("kind", getString(proJson, "kind"));
detailsObj.put("international_flag", getString(extJson, "international_flag"));
detailsObj.put("print_number", getString(extJson, "print_number"));
JSONArray flightsArray_ret = new JSONArray();
if(extJson.containsKey("flights")) {
JSONArray flightsJsonArray = extJson.getJSONArray("flights");
for (int j = 0; j < flightsJsonArray.size(); j++) {
JSONObject flightObject = flightsJsonArray.getJSONObject(j);
JSONObject flightsOject_ret = new JSONObject();
flightsOject_ret.put("from", getString(flightObject, "from"));
flightsOject_ret.put("to", getString(flightObject, "to"));
flightsOject_ret.put("flight_number", getString(flightObject, "flight_number"));
flightsOject_ret.put("date", getString(flightObject, "date"));
flightsOject_ret.put("time", getString(flightObject, "time"));
flightsOject_ret.put("seat", getString(flightObject, "seat"));
flightsOject_ret.put("carrier", getString(flightObject, "carrier"));
flightsArray_ret.add(flightsOject_ret);
}
}
detailsObj.put("flights", flightsArray_ret);
} else if ("7".equals(type)) { //二手车销售统一发票
detailsObj.put("code", getString(infoJson, "code"));
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("seller", getString(payerJson, "company"));
detailsObj.put("seller_tax_id", getString(payerJson, "tcode"));
detailsObj.put("buyer", getString(buyerJson, "company"));
detailsObj.put("buyer_tax_id", getString(buyerJson, "tcode"));
JSONObject usedVehicleJson = extJson.getJSONObject("usedVehicle");
detailsObj.put("company_name", getString(usedVehicleJson, "marketCompany"));
detailsObj.put("company_tax_id", getString(usedVehicleJson, "marketTaxCode"));
detailsObj.put("license_plate", getString(usedVehicleJson, "licensePlate"));
detailsObj.put("registration_number", getString(usedVehicleJson, "registrationNumber"));
detailsObj.put("car_code", getString(usedVehicleJson, "vehicleIdentificationCode"));
detailsObj.put("car_model", getString(usedVehicleJson, "brankNumber"));
detailsObj.put("kind", getString(proJson, "kind"));
detailsObj.put("province", getString(extJson, "province"));
detailsObj.put("city", getString(extJson, "city"));
} else if ("6".equals(type)) { //机动车销售统一发票
detailsObj.put("code", getString(infoJson, "code"));
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("machine_code", "machine_code");
detailsObj.put("machine_number", "machine_number");
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("pretax_amount", getString(priceJson, "amount"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("seller", getString(payerJson, "company"));
detailsObj.put("seller_tax_id", getString(payerJson, "tcode"));
detailsObj.put("buyer", getString(buyerJson, "company"));
detailsObj.put("buyer_tax_id", getString(buyerJson, "tcode"));
JSONObject vehicleDetailJson = extJson.getJSONObject("vehicleDetail");
detailsObj.put("tax_authorities", getString(vehicleDetailJson, "taxOfficeName"));
detailsObj.put("tax_authorities_code", getString(vehicleDetailJson, "taxOfficeCode"));
detailsObj.put("car_code", getString(vehicleDetailJson, "vehicleIdentificationCode"));
detailsObj.put("car_engine_code", getString(vehicleDetailJson, "engineCode"));
detailsObj.put("car_model", getString(vehicleDetailJson, "brankNumber"));
detailsObj.put("certificate_number", getString(vehicleDetailJson, "certificateNumber"));
detailsObj.put("kind", getString(proJson, "kind"));
detailsObj.put("province", getString(extJson, "province"));
detailsObj.put("city", getString(extJson, "city"));
detailsObj.put("tax", getString(extJson, "ttax"));
detailsObj.put("tax_rate", getString(extJson, "trate"));
} else if ("17".equals(type)) { //小票
detailsObj.put("store_name", getString(extJson, "store_name"));
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("time", getString(extJson, "time"));
detailsObj.put("subtotal", getString(priceJson, "amount"));
detailsObj.put("tax", getString(extJson, "tax"));
detailsObj.put("discount", getString(extJson, "discount"));
detailsObj.put("tips", getString(extJson, "tips"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("currency_code", getString(proJson, "ccy"));
detailsObj.put("type", getString(proJson, "kind"));
} else if ("18".equals(type)) { //滴滴出行行程单
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("date_start", getString(extJson, "date_start"));
detailsObj.put("date_end", getString(extJson, "date_end"));
detailsObj.put("phone", getString(extJson, "phone"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("kind", getString(proJson, "kind"));
JSONArray itemsJson_ret = new JSONArray();
if(extJson.containsKey("items")) {
JSONArray itemsJson = extJson.getJSONArray("items");
for (int j = 0; j < itemsJson.size(); j++) {
JSONObject itemJson = itemsJson.getJSONObject(j);
JSONObject itemJson_ret = itemsJson.getJSONObject(j);
itemJson_ret.put("car_type", getString(itemJson, "car_type"));
itemJson_ret.put("time_geton", getString(itemJson, "time_geton"));
itemJson_ret.put("city", getString(itemJson, "city"));
itemJson_ret.put("station_geton", getString(itemJson, "station_geton"));
itemJson_ret.put("station_getoff", getString(itemJson, "station_getoff"));
itemJson_ret.put("mileage", getString(itemJson, "mileage"));
itemJson_ret.put("total", getString(itemJson, "total"));
itemsJson_ret.add(itemJson_ret);
}
}
detailsObj.put("items", itemsJson_ret);
} else if ("19".equals(type)) { //完税证明
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("buyer", getString(buyerJson, "company"));
detailsObj.put("buyer_tax_id", getString(buyerJson, "tcode"));
detailsObj.put("date", getString(proJson, "date"));
} else if ("14".equals(type)) { //船票
detailsObj.put("code", getString(infoJson, "code"));
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("time", getString(extJson, "time"));
detailsObj.put("station_geton", getString(extJson, "station_geton"));
detailsObj.put("station_getoff", getString(extJson, "station_getoff"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("name", getString(extJson, "name"));
detailsObj.put("kind", getString(proJson, "kind"));
detailsObj.put("province", getString(extJson, "province"));
detailsObj.put("city", getString(extJson, "city"));
detailsObj.put("currency_code", getString(proJson, "ccy"));
} else if ("11".equals(type)) { //可报销的其他类型发票
detailsObj.put("code", getString(infoJson, "code"));
detailsObj.put("number", getString(infoJson, "number"));
detailsObj.put("total", getString(priceJson, "total"));
detailsObj.put("date", getString(proJson, "date"));
detailsObj.put("kind", getString(proJson, "kind"));
}
identifyObj.put("details", detailsObj);
//extra
JSONObject extraObj = new JSONObject();
extraObj.put("check_code_candidates", "");
extraObj.put("check_code_last_six", "");
extraObj.put("number_order_error", "");
extraObj.put("qrcode", "");
extraObj.put("barcode", "");
identifyObj.put("extra", extraObj);
identify_results.add(identifyObj);
} else {
//识别失败
resultJsonObj.put("result", 0);
resultJsonObj.put("message", "错误码ret=" + ret);
return resultJsonObj;
}
}
//返回数据
dataJsonObj.put("result", 1);
dataJsonObj.put("message", "");
dataJsonObj.put("identify_results", identify_results);
//extra
JSONObject extraObj = new JSONObject();
extraObj.put("qrcode", "");
extraObj.put("barcode", "");
dataJsonObj.put("extra", extraObj);
//封装的完整标准数据
JSONObject packageJsonObj = new JSONObject();
packageJsonObj.put("result", 1);
packageJsonObj.put("message", "");
JSONObject responseJsonObj = new JSONObject();
responseJsonObj.put("data", dataJsonObj);
packageJsonObj.put("response", responseJsonObj);
resultJsonObj.put("status", Constants.SUCCESS_CODE);
resultJsonObj.put("returnInfo", packageJsonObj);
return resultJsonObj;
}
/**
*
* @throws Exception
*/
public static JSONObject uploadPicture(File localFile,String url) throws Exception {
JSONObject jsonObject=new JSONObject();
try{
PostMethod filePost = new PostMethod(url);
FilePart fp = new FilePart("file", localFile);
// StringPart:普通的文本参数
Part[] parts = {fp};
// 对于MIME类型的请求httpclient建议全用MulitPartRequestEntity进行包装
MultipartRequestEntity mre = new MultipartRequestEntity(parts, filePost.getParams());
filePost.setRequestEntity(mre);
HttpClient client = new HttpClient();
int status = client.executeMethod(filePost);
if(status==200){
String responseBodyAsString = filePost.getResponseBodyAsString();
JSONObject returninfo = JSONObject.fromObject(responseBodyAsString);
jsonObject.put("status", "0");
jsonObject.put("returnInfo", returninfo);
}else{
throw new Exception("接口地址请求失败!");
}
}catch (Exception e){
jsonObject.put("status", "1");
jsonObject.put("msg", e.getMessage());
}
return jsonObject;
}
/**
*
* @param invoiceCode
* @param invoiceNo
* @param price
* @param billingDate
* @param crcCode
* @param cid
* @param checkUrl
* @param user
* @return
*/
public static JSONObject autoCheckInvoice(String invoiceCode, String invoiceNo, String price, String billingDate, String crcCode,
String cid, String checkUrl,User user,String userName,String password) throws Exception {
DecimalFormat df = new DecimalFormat("############################0.00");
JSONObject resultObj = new JSONObject();
JSONObject param = new JSONObject();
param.put("cid",cid);
param.put("userId",user.getUID());
param.put("code",invoiceCode);
param.put("number",invoiceNo);
billingDate = billingDate.replaceAll("-","");
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
Date date = dateFormat.parse(billingDate);
int time = Math.round(date.getTime()/1000);
param.put("date",time);
param.put("chcode",crcCode);
param.put("amount",price);
param.put("total","");//机动车暂不支持
param.put("is_save", "1");
String content = invoiceCloudEncode(param.toString(), password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid, Util.date(2),"OA发送请求","发票查验",checkUrl,userName,password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param.toString(), "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content",content, "uuid", uuid, "string");
String data = postToUrl(checkUrl, content, map, "", uuid,"check",user,"");
JSONObject dataJson = JSONObject.fromObject(data);
//解析报文开始
JSONObject infoJson = dataJson.getJSONObject("info");
JSONObject comm_infoJson = infoJson.getJSONObject("comm_info");
JSONObject proJson = comm_infoJson.getJSONObject("pro");
JSONObject priceJson = comm_infoJson.getJSONObject("price");
JSONObject buyerJson = comm_infoJson.getJSONObject("buyer");
JSONObject payerJson = comm_infoJson.getJSONObject("payer");
String ext = infoJson.getString("ext");
JSONObject extJson = JSONObject.fromObject(ext);
String status = getString(proJson,"status");//状态
if("2".equals(status)){
//记录错误信息
FnaInvoiceCommon.saveFailLog(user.getUID(), 1, SystemEnv.getHtmlLabelName(509480, user.getLanguage()));
throw new Exception(SystemEnv.getHtmlLabelName(509480, user.getLanguage()));
}
String type = getString(proJson,"type");//标题
String title = getString(proJson,"cname");//标题
String _taxIncludedPrice = getString(priceJson,"total");//价税合计
String _priceWithoutTax = getString(priceJson,"amount");//不含税金额
String _tax = getString(extJson,"ttax");
String _invoiceNumber = getString(infoJson,"number");//发票号码
String _invoicecode = getString(infoJson,"code");//代码
String _checkCode = getString(proJson,"chcode");//校验码
String _purchaser = getString(buyerJson,"company");//购买方
String _seller = getString(payerJson,"company");//销售方
String _purchaserTaxNo = getString(buyerJson,"tcode");//购买方纳税人识别号
String _salesTaxNo = getString(payerJson,"tcode");//销售方纳税人识别号
String _billingDate = getString(proJson,"date");//开票日期
String _remark = getString(extJson,"comment");//备注信息
String _sellerAddress = getString(extJson,"pcontact");//销售方电话、地址
String _purchaserAddress = getString(extJson,"bcontact");//购买方电话、地址
String _salesBank = getString(extJson,"pbank");//销售方开户行及账号
String _purchaserBank = getString(extJson,"bbank");//购买方开户行及账号
String _taxRate = getString(extJson,"trate");//税率
String _invoiceServiceYype = "";//货物或应税服务类型
JSONArray items = new JSONArray();//发票明细
if(extJson.containsKey("products")){
JSONArray productsArray = extJson.getJSONArray("products");
for(int i=0;i<productsArray.size();i++){
JSONObject productJson = productsArray.getJSONObject(i);
String CommodityName = getString(productJson,"name");
if("".equals(_invoiceServiceYype)) {
_invoiceServiceYype = CommodityName;
}
String UnitPrice = getString(productJson,"price");
String Quantity = getString(productJson,"qty");
String specification = getString(productJson,"smodel");
String unit = getString(productJson,"muint");
String Amount = getString(productJson,"amount");
String TaxRate = String.valueOf(Util.getDoubleValue(getString(productJson,"trate"),0.00)/100);
String Tax = getString(productJson,"tprice");
String startDate = getString(productJson,"txrqq");
String endDate = getString(productJson,"txrqz");
String numberPlate = getString(productJson,"txfCph");
String carType = getString(productJson,"txfLx");
JSONObject jsonItems = new JSONObject();
jsonItems.put("Quantity", Quantity);
jsonItems.put("UnitPrice", UnitPrice);
jsonItems.put("CommodityName", CommodityName);
jsonItems.put("Amount", Amount);
jsonItems.put("TaxRate", TaxRate);
jsonItems.put("Tax", Tax);
jsonItems.put("specification", specification);
jsonItems.put("unit", unit);
jsonItems.put("startDate", startDate);
jsonItems.put("endDate", endDate);
jsonItems.put("numberPlate", numberPlate);
jsonItems.put("type", carType);
items.add(jsonItems);
}
}
//以下代码可能某些客户版本较低,不存在
{
int id= 0;
rs.executeQuery("select id from fnaInvoiceDetailInfo where invoiceNumber=? and invoiceCode=?",_invoiceNumber,_invoicecode);
if(rs.next()){
id = Util.getIntValue(rs.getString("id"),0);
}
if(id <=0){
rs.executeUpdate("insert into fnaInvoiceDetailInfo (invoiceNumber,invoiceCode) values(?,?)",_invoiceNumber,_invoicecode);
rs.executeQuery("select id maxid from fnaInvoiceDetailInfo where invoiceNumber=? and invoiceCode=?",_invoiceNumber,_invoicecode);
int maxid = 0;
if(rs.next()){
maxid = Util.getIntValue(rs.getString("maxid"));
}
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceDetailInfo", "detailInfo", items.toString(), "id", maxid+"", "int");
}else{
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceDetailInfo", "detailInfo", items.toString(), "id", id+"", "int");
}
FnaAbstractInterface.saveInvoiceServiceYype(items, "CommodityName");
}
//机动车销售统一发票特殊字段
String machine_code=getString(extJson,"machine_code");//机打代码
String machine_number=getString(extJson,"machine_number");//机打号码
String tax_authorities=getString(extJson,"taxOfficeName");//主管税务机关
String tax_authorities_code=getString(extJson,"taxOfficeCode");//主管税务机关代码
String car_code=getString(extJson,"vehicleIdentificationCode");//车架号/车辆识别代码
String car_engine_code=getString(extJson,"engineCode");//发动机号码
String car_model=getString(extJson,"brankNumber");//厂牌型号
String certificate_number=getString(extJson,"certificateNumber");//合格证号
resultObj.put("title", title);
resultObj.put("_taxIncludedPrice", df.format(Util.getDoubleValue(_taxIncludedPrice,0.00)));
resultObj.put("_priceWithoutTax", df.format(Util.getDoubleValue(_priceWithoutTax,0.00)));
resultObj.put("_tax", df.format(Util.getDoubleValue(_tax,0.00)));
resultObj.put("_taxRate", df.format(Util.getDoubleValue(_taxRate,0.00)));
resultObj.put("_invoiceNumber", _invoiceNumber);
resultObj.put("_invoicecode", _invoicecode);
resultObj.put("_purchaser", _purchaser);
resultObj.put("_seller", _seller);
resultObj.put("_purchaserTaxNo", _purchaserTaxNo);
resultObj.put("_salesTaxNo", _salesTaxNo);
resultObj.put("_billingDate", _billingDate);
resultObj.put("_remark", _remark);
resultObj.put("_sellerAddress", _sellerAddress);
resultObj.put("_purchaserAddress", _purchaserAddress);
resultObj.put("_salesBank", _salesBank);
resultObj.put("_purchaserBank", _purchaserBank);
resultObj.put("_checkCode", _checkCode);
resultObj.put("_invoiceServiceYype", _invoiceServiceYype);
resultObj.put("_invoiceType", Constants.CLOUDTOOATYPE.get(type));
int recoginizeinvoiceType = SdkInvoiceUtil.recoginizeInvoiceType(invoiceCode);
resultObj.put("fplx", recoginizeinvoiceType);
//机动车销售统一发票特殊字段
resultObj.put("_machine_code", machine_code);
resultObj.put("_machine_number", machine_number);
resultObj.put("_tax_authorities", tax_authorities);
resultObj.put("_tax_authorities_code", tax_authorities_code);
resultObj.put("_car_code", car_code);
resultObj.put("_car_engine_code", car_engine_code);
resultObj.put("_car_model", car_model);
resultObj.put("_certificate_number", certificate_number);
resultObj.put("detaildata", items);
resultObj.put("status", "1");
return resultObj;
}
/**
* -
* @param user
* @return
*/
public static boolean isExistInvoiceCloudInterface(User user){
JSONObject interfaceInfo = InvoiceCloudUtil.getInterfaceInfo(user, false, false, true);
JSONObject cloudInfo = interfaceInfo.getJSONObject("cloud");
boolean existEffectCloud = cloudInfo.getBoolean("existEffectCloud");
return existEffectCloud;
}
/**
* cloudId(id)inoviceId(id)
* @param ids
* @param method cloudIdinoviceId cloudIdinoviceIdcloudId, inoviceIdcloudIdinoviceId
* @return idsids
*/
public static String getCloudIdOrInoviceId(String ids,String method){
StringBuffer idsBuffer = new StringBuffer();
RecordSet rs = new RecordSet();
String[] idsSplit = ids.split(",");
if("cloudId".equals(method)){
for(int i=0;i<idsSplit.length;i++){
rs.executeQuery("select cloudId from fnaInvoiceLedger where id=?",idsSplit[i]);
if(rs.next()){
String cloudId = Util.null2String(rs.getString("cloudId"));
if(idsBuffer.length()==0){
idsBuffer.append(cloudId);
}else{
idsBuffer.append(",").append(cloudId);
}
}
}
}else if("inoviceId".equals(method)){
for(int i=0;i<idsSplit.length;i++){
rs.executeQuery("select id from fnaInvoiceLedger where cloudId=?",idsSplit[i]);
if(rs.next()){
String id = Util.null2String(rs.getString("id"));
if(idsBuffer.length()==0){
idsBuffer.append(id);
}else{
idsBuffer.append(",").append(id);
}
}
}
}
return idsBuffer.toString();
}
/**
* @Description: /
* @param interfaceurl
* @param param
* @param userName
* @param password
* @return: net.sf.json.JSONObject
* @Author: konghang
* @Date: 10:04 2020/10/14
*/
public static JSONObject synOwnerInfo(String interfaceurl, JSONObject param, String userName, String password) {
JSONObject jsonObject = new JSONObject();
try {
String content = invoiceCloudEncode(param.toString(), password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid, Util.date(2), "OA发送请求", "同步转移归属人/共享人信息到发票云", interfaceurl, userName, password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param.toString(), "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content", content, "uuid", uuid, "string");
String data = postToUrl(interfaceurl, content, map, "", uuid);
jsonObject.put("flag", true);
jsonObject.put("data", data);
} catch (Exception e) {
jsonObject.put("flag", false);
jsonObject.put("msg", e.getMessage());
}
return jsonObject;
}
/**
* @Description:
* @param interfaceurl
* @param param
* @param userName
* @param password
* @return: net.sf.json.JSONObject
* @Author: konghang
* @Date: 10:04 2020/10/14
*/
public static JSONObject sysSharerInfo(String interfaceurl, JSONObject param, String userName, String password) {
JSONObject jsonObject = new JSONObject();
try {
String content = invoiceCloudEncode(param.toString(), password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid, Util.date(2), "OA发送请求", "同步共享人信息到发票云", interfaceurl, userName, password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param.toString(), "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content", content, "uuid", uuid, "string");
String data = postToUrl(interfaceurl, content, map, "", uuid);
jsonObject.put("flag", true);
jsonObject.put("data", data);
} catch (Exception e) {
jsonObject.put("flag", false);
jsonObject.put("msg", e.getMessage());
}
return jsonObject;
}
/**
* 使
* @param cid
* @param userId
* @return
*/
public static JSONObject getInvoiceUsedNumberInfo(String cid,int userId){
JSONObject invoiceCloudUrl = InvoiceCloudUtil.getInvoiceCloudUrl();
RecordSet rs = new RecordSet();
String userName="";
String password="";
String javaUrl="";
rs.executeQuery("select * from fnaInvoiceInterface where cid=?",cid);
if(rs.next()){
userName = Util.null2String(rs.getString("userName"));
password = FnaInvoiceCommon.fnaDecrypt(Util.null2String(rs.getString("password")));
javaUrl = Util.null2String(rs.getString("javaUrl"));
}
return getInvoiceUsedNumberInfo(javaUrl+"/"+invoiceCloudUrl.getString("invoiceUsedNumberInfo"),cid,userName,password,userId);
}
/**
* 使
* @param invoiceUsedNumberInfoUrl
* @param cid
* @param userName
* @param password
* @param userId
* @return
*/
public static JSONObject getInvoiceUsedNumberInfo(String invoiceUsedNumberInfoUrl,String cid,String userName,String password,int userId){
JSONObject jsonObject = new JSONObject();
try{
JSONObject param = new JSONObject();
param.put("cid",cid);
param.put("userId",userId);
String content = invoiceCloudEncode(param.toString(), password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid,Util.date(2),"OA发送请求","获取发票使用次数",invoiceUsedNumberInfoUrl,userName,password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param.toString(), "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content",content, "uuid", uuid, "string");
String data = postToUrl(invoiceUsedNumberInfoUrl, content, map, "",uuid);
jsonObject.put("flag",true);
jsonObject.put("data",data);
}catch (Exception e){
jsonObject.put("flag",false);
jsonObject.put("msg",e.getMessage());
}
return jsonObject;
}
/**
* AESkey
* @param invoiceUsedNumberInfoUrl
* @param cid
* @param userName
* @param password
* @param userId
* @return
*/
public static JSONObject createAesKey(String createAesKeyUrl,String password,String userName){
JSONObject jsonObject = new JSONObject();
try{
String content = invoiceCloudEncode("", password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid,Util.date(2),"OA发送请求","获取AES加密的key",createAesKeyUrl,userName,password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content",content, "uuid", uuid, "string");
String data = postToUrl(createAesKeyUrl, content, map, "",uuid);
jsonObject.put("flag",true);
jsonObject.put("data",data);
}catch (Exception e){
jsonObject.put("flag",false);
jsonObject.put("msg",e.getMessage());
}
return jsonObject;
}
/**
*
* @param reimburseUrl
* @param aesKey
* @param bodyJson
* @param userName
* @param password
* @param description
* @return
*/
public static JSONObject reimburseInvoice(String reimburseUrl,String aesKey ,JSONObject bodyJson ,String userName,String password,String description){
JSONObject jsonObject = new JSONObject();
try{
String bodyStr = InvoiceCloudAESUtil.encrypt(aesKey,bodyJson.toString());
String content = invoiceCloudEncode(bodyStr.toString(), password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid,Util.date(2),"OA发送请求",description,reimburseUrl,userName,password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", bodyJson.toString(), "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content",content, "uuid", uuid, "string");
String data = postToUrl(reimburseUrl, content, map, "",uuid,aesKey);
jsonObject.put("flag",true);
jsonObject.put("data",data);
}catch (Exception e){
jsonObject.put("flag",false);
jsonObject.put("msg",e.getMessage());
}
return jsonObject;
}
/**
*
* @param imageBytes
* @param cid
* @param ocrUrl
* @param tokenUrl
* @param uploadUrl
* @param user
* @param userName
* @param password
* @return
* @throws Exception
*/
public static JSONArray uploadFileInvoice(byte[] imageBytes, String cid, String ocrUrl,String localCheckUrl,String tokenUrl,String uploadUrl, User user, String userName, String password) throws Exception {
JSONArray uoloadFileArray = new JSONArray();
//1.先上传图片获取图片id
String imageId = getImageId(imageBytes,cid,tokenUrl,uploadUrl,user, userName, password);
//2.识别
JSONObject param = new JSONObject();
param.put("cid", cid);
param.put("userId", user.getUID());
param.put("image_index", imageId);
param.put("operate_type", "0");
param.put("is_save", "0");
String content = invoiceCloudEncode(param.toString(), password);
Map<String, String> map = new HashMap<String, String>();
map.put("appkey", userName);
//插入日志表fnaInvoiceCloudLog
RecordSet rs = new RecordSet();
String uuid = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid, Util.date(2), "OA发送请求", "发票识别新-发票云", ocrUrl, userName, password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param.toString(), "uuid", uuid, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content", content, "uuid", uuid, "string");
String data = postToUrl(ocrUrl, content, map, "", uuid, "check", user,"");
JSONObject dataJson = JSONObject.fromObject(data);
//插入调用记录日志
JSONObject jo = new JSONObject();
jo.put("status","0");
jo.put("returnInfo", dataJson);
FnaInvoiceCommon.addFnainvoiceLog("1",imageBytes,"","","","","",
jo, user, "OCR","");
JSONArray infoArrayJson = dataJson.getJSONArray("infos");
String open_valid = Util.null2String(getString(dataJson,"open_valid"));
int infoArrayJson_len = infoArrayJson.size();
if(infoArrayJson_len==0){
FnaInvoiceCommon.saveFailLog(user.getUID(), 0, SystemEnv.getHtmlLabelName(509482, user.getLanguage()));//识别结果为空!
throw new Exception(SystemEnv.getHtmlLabelName( 509587,user.getLanguage()));
}
for (int i = 0; i < infoArrayJson_len; i++) {
JSONObject uploadFileJson = new JSONObject();
JSONObject infoArrayJsonElt = infoArrayJson.getJSONObject(i);
String ret = Util.null2String(getString(infoArrayJsonElt,"ret"));
JSONObject infoJson = infoArrayJsonElt.getJSONObject("info");
JSONObject comm_info = infoJson.getJSONObject("comm_info");
JSONObject pro = comm_info.getJSONObject("pro");
String type = Util.null2String(getString(infoJson,"type"));
String cloudId = Util.null2String(getString(infoJson,"fid"));
String invoiceNumber = Util.null2String(getString(infoJson,"number"));
if ("0".equals(ret)) {
if("1".equals(open_valid) && ("1".equals(type) || "2".equals(type) || "3".equals(type) || "4".equals(type) || "5".equals(type) || "6".equals(type) || "7".equals(type))){//需要查验
JSONObject param1 = new JSONObject();
param1.put("fid", cloudId);
String content1 = invoiceCloudEncode(param1.toString(), password);
Map<String, String> map1 = new HashMap<String, String>();
map1.put("appkey", userName);
String uuid1 = FnaCommon.getPrimaryKeyGuid1();
rs.executeUpdate("insert into fnaInvoiceCloudLog(uuid,enterTime,requestType,description,interfaceurl,userName,password) values(?,?,?,?,?,?,?)",
uuid1, Util.date(2), "OA发送请求", "发票查验新-发票云", localCheckUrl, userName, password);
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "param", param1.toString(), "uuid", uuid1, "string");
FnaCommon.updateDbClobOrTextFieldValue("fnaInvoiceCloudLog", "md5Content", content1, "uuid", uuid1, "string");
try{
String data1 = postToUrl(localCheckUrl, content1, map1, "", uuid1,"check",user,"");
JSONObject dataJson1 = JSONObject.fromObject(data1);
JSONObject infoJson1 = dataJson1.getJSONObject("info");
JSONObject comm_infoJson = infoJson1.getJSONObject("comm_info");
JSONObject proJson = comm_infoJson.getJSONObject("pro");
String status = getString(proJson,"status");//状态
if("2".equals(status)){
//记录错误信息
FnaInvoiceCommon.saveFailLog(user.getUID(), 1, SystemEnv.getHtmlLabelName(509480, user.getLanguage()));
uploadFileJson.put("msg",invoiceNumber+":"+SystemEnv.getHtmlLabelName(509480, user.getLanguage()));
uploadFileJson.put("flag",false);
}else{
uploadFileJson.put("flag",true);
}
}catch (Exception e){
uploadFileJson.put("flag",false);
uploadFileJson.put("msg",invoiceNumber+":"+e.getMessage());
}
}else{
uploadFileJson.put("flag",true);
}
uploadFileJson.put("cloudId",cloudId);
}else{
uploadFileJson.put("cloudId",cloudId);
uploadFileJson.put("msg",Util.null2String(getString(infoArrayJsonElt,"message")));
uploadFileJson.put("flag",true);
}
uoloadFileArray.add(uploadFileJson);
}
return uoloadFileArray;
}
}