/* * Copyright (c) 2001-2016 泛微软件. * 泛微协同商务系统,版权所有. * */ package weaver.fna.invoice.common; import java.io.*; import java.security.MessageDigest; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.jsp.JspWriter; import com.api.doc.detail.service.DocSaveService; import com.engine.fna.util.FnaTakeOneNoteCostTypeUtil; import com.engine.personalIncomeTax.biz.RecordsBiz; import org.apache.commons.lang.StringEscapeUtils; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils; import com.cloudstore.dev.api.util.APPManager; //import b.a.a.ac.r; import org.apache.commons.codec.binary.Base64; import net.coobird.thumbnailator.Thumbnails; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import weaver.conn.BatchRecordSet; import weaver.conn.RecordSet; import weaver.file.ImageFileManager; import weaver.fna.e9.po.base.FnaInvoiceLedger; import weaver.fna.general.FnaCommon; import weaver.fna.general.FnaLogSqlUtil; import weaver.fna.invoice.entity.FnaInvoiceInterface; import weaver.fna.invoice.entity.FnaInvoiceLedgerDetail; import weaver.fna.invoice.interfaces.baiwang.FnaBaiwangOpenApi; import weaver.fna.invoice.sdk.SdkInvoiceUtil; import weaver.fna.invoice.utils.*; import weaver.general.BaseBean; import weaver.general.ThreadVarLanguage; import weaver.general.Util; import weaver.hrm.User; import weaver.hrm.company.DepartmentComInfo; import weaver.hrm.company.SubCompanyComInfo; import weaver.hrm.resource.ResourceBelongtoComInfo; import weaver.hrm.resource.ResourceComInfo; import weaver.sm.SM4Utils; import weaver.systeminfo.SystemEnv; /** * 发票公共处理类 * */ @SuppressWarnings({ "rawtypes", "deprecation" }) public final class FnaInvoiceCommon extends BaseBean{ //ea92aec4-45f2-4ef9-9fd6-b25000481ba4,password public static final String MDE_CODE = "WEAVER_39CE313C5FAAC649EF10269F69C06B3D"; //56f3236a-a9c6-40b5-84e6-56749fba3012,client_secret public static final String MDE_CODE_CLIENT_SECRET = "WEAVER_FFC947EA939B3C5F74A53C8F0D9F99F5"; //978c7c07-24f0-4a65-97aa-50f9d4f88ace,sqm public static final String MDE_CODE_SQM = "WEAVER_D8165D1FBC808F0DFE4016073A3A2A80"; //de9a995f-79c5-43dc-b353-4a3f3f82ff6b,SM4加密密钥 public static String SM4 = ""; static { getSM(); } public static void getSM(){ //初始化前fnaEncryptInfo表中无数据,考虑老数据问题,如果fnainvoiceinterface表中有数据,使用老的加密方式,否则随机生成一个 RecordSet rs = new RecordSet(); SM4=""; int sign=0; rs.executeQuery("select smkey,sign from fnaEncryptInfo"); if(rs.next()){ SM4 = Util.null2String(rs.getString("smkey")); sign = Util.getIntValue(rs.getString("sign"),0); } if(sign!=1){ int cnt=0; rs.executeQuery("select count(id) cnt from fnainvoiceinterface"); if(rs.next()){ cnt = Util.getIntValue(rs.getString("cnt"),0); } if(cnt<=0) { SM4 = FnaCommon.getPrimaryKeyGuid1(); rs.executeUpdate("update fnaEncryptInfo set smkey=?,sign=?",SM4,"1"); } } } /** 金额格式化对象;保留两位小数*/ DecimalFormat df = new DecimalFormat("####################################################0.00"); /**来自微信*/ public static final int INVOICESOURCE_WECHAT = 1; /**来自国信*/ public static final int INVOICESOURCE_GUOXIN = 2; /**来自台帐*/ public static final int INVOICESOURCE_TAIZHANG = 3; /**来自百望*/ public static final int INVOICESOURCE_BAIWANG = 4; /**来自发票识别*/ public static final int INVOICESOURCE_OCR = 5; /**来自发票识别*/ public static final int INVOICESOURCE_EMAIL = 6; /**初始状态*/ public static final int INIT_STATUS = 0; /**冻结状态*/ public static final int LOCK_STATUS = 1; /**核销状态*/ public static final int CLOSURE_STATUS = 2; /** 批量更新发票状态*/ private String UPDATEINVOICESTATUS_URL = "https://qyapi.weixin.qq.com/cgi-bin/card/invoice/reimburse/updatestatusbatch?access_token="; /** 批量查询电子发票*/ private String GETINVOICEINFOBATCH_URL = "https://qyapi.weixin.qq.com/cgi-bin/card/invoice/reimburse/getinvoiceinfobatch?access_token="; /** corpId 企业号ID*/ private String corpId = ""; /** 最大上传大小 2.5 * 1024 * 1024 */ public static final double MAX_BYTES = 2.5 * 1000 * 1000; /** 最大上传大小 2.5 * 1024 * 1024 */ public static final double MAX_BYTES_RQ = 8.0 * 1000 * 1000; /**压缩图片质量递减间隔*/ private static final double DIMINISHING_INTERVAL = 0.5d; /** * 错误信息 */ private final static ConcurrentHashMap CONCURRENT_HASH_MAP = new ConcurrentHashMap(); static{ CONCURRENT_HASH_MAP.put("72015", ""+ SystemEnv.getHtmlLabelName(10003250,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72017", ""+ SystemEnv.getHtmlLabelName(10003251,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72023", ""+ SystemEnv.getHtmlLabelName(10003252,weaver.general.ThreadVarLanguage.getLang())+"/"+ SystemEnv.getHtmlLabelName(10003253,weaver.general.ThreadVarLanguage.getLang())+"/App"+ SystemEnv.getHtmlLabelName(10003254,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72024", ""+ SystemEnv.getHtmlLabelName(10003255,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72025", "wx_invoice_token "+ SystemEnv.getHtmlLabelName(2245,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72028", ""+ SystemEnv.getHtmlLabelName(10003256,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72029", ""+ SystemEnv.getHtmlLabelName(10003257,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72030", "mchid "+ SystemEnv.getHtmlLabelName(2245,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72031", ""+ SystemEnv.getHtmlLabelName(10003258,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72035", ""+ SystemEnv.getHtmlLabelName(10003259,weaver.general.ThreadVarLanguage.getLang())+"order_id"+ SystemEnv.getHtmlLabelName(10003260,weaver.general.ThreadVarLanguage.getLang())+"order_id"+ SystemEnv.getHtmlLabelName(10003261,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72036", ""+ SystemEnv.getHtmlLabelName(10003262,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72038", ""+ SystemEnv.getHtmlLabelName(10003263,weaver.general.ThreadVarLanguage.getLang())+" appid 、"+ SystemEnv.getHtmlLabelName(10003264,weaver.general.ThreadVarLanguage.getLang())+" appid 、"+ SystemEnv.getHtmlLabelName(26738,weaver.general.ThreadVarLanguage.getLang())+" order_id "+ SystemEnv.getHtmlLabelName(386675,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72039", ""+ SystemEnv.getHtmlLabelName(10003265,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72040", "Pdf "+ SystemEnv.getHtmlLabelName(10003266,weaver.general.ThreadVarLanguage.getLang())+" pdf"); CONCURRENT_HASH_MAP.put("72042", ""+ SystemEnv.getHtmlLabelName(10003267,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72043", ""+ SystemEnv.getHtmlLabelName(10003268,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("72044", ""+ SystemEnv.getHtmlLabelName(10003269,weaver.general.ThreadVarLanguage.getLang())+""); CONCURRENT_HASH_MAP.put("40078", "card_id"+ SystemEnv.getHtmlLabelName(10003270,weaver.general.ThreadVarLanguage.getLang())+" "+ SystemEnv.getHtmlLabelName(10003271,weaver.general.ThreadVarLanguage.getLang())+" "+ SystemEnv.getHtmlLabelName(10003272,weaver.general.ThreadVarLanguage.getLang())+"card_id"+ SystemEnv.getHtmlLabelName(10003273,weaver.general.ThreadVarLanguage.getLang())+""); } /** * 构造方法 */ public FnaInvoiceCommon(){ corpId = getPropValue("wechatElecInvoice_e9", "corpId").trim(); } /** * 发票代码校验 * @param invoiceCode * @throws Exception */ public void checkInvoicecodeIflegal(String invoiceCode,int invoiceTypeSrc) throws Exception{ int invoiceType = 0; if(invoiceCode.length() == 10){ String eight = String.valueOf(invoiceCode.charAt(7)); if("1".equals(eight) || "2".equals(eight) || "5".equals(eight) || "7".equals(eight)){ invoiceType = 1; }else if("3".equals(eight) || "6".equals(eight)){ invoiceType = 2; } }else if(invoiceCode.length() == 12){ String first = String.valueOf(invoiceCode.charAt(0)); String elevenTwelve = String.valueOf(invoiceCode.charAt(10)) + String.valueOf(invoiceCode.charAt(11)); if("0".equals(first) && ("04".equals(elevenTwelve) || "05".equals(elevenTwelve) || "06".equals(elevenTwelve) || "07".equals(elevenTwelve) || "11".equals(elevenTwelve) || "12".equals(elevenTwelve))){ invoiceType = 2; } } //没有发票类型 if(invoiceType == 0){ throw new Exception("请输入正确的发票代码!"); } //发票代码与发票类型不匹配 if((invoiceTypeSrc == 1 && invoiceType == 1) || (invoiceTypeSrc == 2 && invoiceType == 2)){ throw new Exception("请输入正确的发票代码!!"); } } /** * 新建或更新发票 * @param request * @param response * @param out * @param user */ public void saveInvoice(HttpServletRequest request, HttpServletResponse response, JspWriter out, User user) throws Exception{ String entryTime = Util.date(2);//录入时间 int userid = user.getUID(); int language = user.getLanguage(); StringBuffer errorMsg = new StringBuffer(); RecordSet rs = new RecordSet(); BatchRecordSet brs = new BatchRecordSet(); int currentid = Util.getIntValue(request.getParameter("id"),0); String billingDate = Util.null2String(request.getParameter("billingDate")); String invoiceCode = Util.null2String(request.getParameter("invoiceCode")); String invoiceNumber = Util.null2String(request.getParameter("invoiceNumber")); int invoiceType = Util.getIntValue(request.getParameter("invoiceType")); String checkCode = Util.null2String(request.getParameter("checkCode")); String seller = Util.null2String(request.getParameter("seller")); String purchaser = Util.null2String(request.getParameter("purchaser")); String purchaserTaxNo=Util.null2String(request.getParameter("purchaserTaxNo")); String salesTaxNo=Util.null2String(request.getParameter("salesTaxNo")); int indexnum = Util.getIntValue(request.getParameter("linkage_indexnum")); double priceWithoutTax = Util.getDoubleValue(request.getParameter("priceWithoutTax"),0.00); double tax = Util.getDoubleValue(request.getParameter("tax"),0.00); double taxIncludedPrice = Util.getDoubleValue(request.getParameter("taxIncludedPrice"),0.00); try { //校验invoiceCode发票代码 Pattern pattern = Pattern.compile("[0-9]*"); Matcher isNum = pattern.matcher(invoiceCode); if(!isNum.matches()){ throw new Exception(SystemEnv.getHtmlLabelName(10000026, Util.getIntValue(language)));//XXX数据不正确 } //存在10位和12位两种情况 if(invoiceCode.length() != 10 && invoiceCode.length() != 12){ throw new Exception(SystemEnv.getHtmlLabelName(10000026, Util.getIntValue(language))+"!");//XXX数据不正确 } /** if(invoiceType == 1){//增值税普通发票 //当位数为12位时,不需要判断,当位数为10位时需判断 if(invoiceCode.length() == 10 && !invoiceCode.substring(invoiceCode.length()-2, invoiceCode.length()-1).equals("2")){ throw new Exception(SystemEnv.getHtmlLabelName(10000026,weaver.general.Util.getIntValue(language))+"!!!");//XXX数据不正确 } }else if(invoiceType == 2){//增值税专用发票 if(invoiceCode.length() == 10 && !invoiceCode.substring(invoiceCode.length()-2, invoiceCode.length()-1).equals("3")){ throw new Exception(SystemEnv.getHtmlLabelName(10000026,weaver.general.Util.getIntValue(language))+"!!!");//XXX数据不正确 } if(invoiceCode.length() == 12){ throw new Exception(SystemEnv.getHtmlLabelName(10000026,weaver.general.Util.getIntValue(language))+"!!!");//XXX数据不正确 } } */ checkInvoicecodeIflegal(invoiceCode,invoiceType); //校验invoiceNumber发票号码 isNum = pattern.matcher(invoiceNumber); if(!isNum.matches()){ throw new Exception(SystemEnv.getHtmlLabelName(10000027, Util.getIntValue(language)));//XXX数据不正确 } if(invoiceNumber.length() != 8){ throw new Exception(SystemEnv.getHtmlLabelName(10000027, Util.getIntValue(language))+"!!");//XXX数据不正确 } String sql = "select * from FnaInvoiceLedger where invoiceNumber = '"+invoiceNumber+"'"; boolean flag = rs.execute(sql); if(!flag)throw new Exception(SystemEnv.getHtmlLabelName(10000018, Util.getIntValue(language)));//数据库错误!请联系管理员! int id = 0; String invoiceNo = ""; if(rs.next()){ id = Util.getIntValue(rs.getString("id")); invoiceNo = Util.null2String(rs.getString("invoiceNumber")); } if(id != 0 && currentid != id && invoiceNumber.equals(invoiceNo)){ throw new Exception(SystemEnv.getHtmlLabelName(10000028, Util.getIntValue(language)).replace("#replaceString#", "【"+invoiceCode+"】【"+invoiceNumber+"】"));//XXX已存在! } //校验invoiceType发票类型 if(invoiceType != 1 && invoiceType != 2 && invoiceType != 15 && invoiceType != 16 && invoiceType != 20){ throw new Exception(SystemEnv.getHtmlLabelName(10000031, Util.getIntValue(language))); } //校验checkCode校验码 if(invoiceType == 1){//普通发票校验,专用发票没有校验码 if(checkCode == null){ throw new Exception(SystemEnv.getHtmlLabelName(10000142,language));//XXX不能为空! } pattern = Pattern.compile("^[0-9]{20}$"); Matcher matcher = pattern.matcher(checkCode.trim()); if(!matcher.matches()){ throw new Exception(SystemEnv.getHtmlLabelName(10000143,language));//XXX必须为长度是20的数字! } } //校验明细信息 for(int i = 0;i 0){//更新发票 String update = "update FnaInvoiceLedger set billingDate='"+StringEscapeUtils.escapeSql(billingDate)+"',"+ " invoiceCode='"+StringEscapeUtils.escapeSql(invoiceCode)+"',"+ " invoiceNumber='"+StringEscapeUtils.escapeSql(invoiceNumber)+"',"+ " invoiceType='"+invoiceType+"',"+ " checkCode='"+StringEscapeUtils.escapeSql(checkCode)+"',"+ " seller='"+StringEscapeUtils.escapeSql(seller)+"',"+ " purchaser='"+StringEscapeUtils.escapeSql(purchaser)+"',"+ " purchaserTaxNo='"+StringEscapeUtils.escapeSql(purchaserTaxNo)+"',"+ " salesTaxNo='"+StringEscapeUtils.escapeSql(salesTaxNo)+"',"+ " priceWithoutTax = "+df.format(priceWithoutTax)+","+ " tax = "+df.format(tax)+","+ " taxIncludedPrice = "+df.format(taxIncludedPrice)+" "+ " where id = "+currentid; rs.execute(update); }else{ String insert = "insert into FnaInvoiceLedger(billingDate,invoiceCode,invoiceNumber,invoiceType,checkCode,seller,purchaser,purchaserTaxNo,salesTaxNo,priceWithoutTax,tax,taxIncludedPrice,authenticity"+ ",userid_new,invoiceSource_new,status,entryTime) values ("+ "'"+StringEscapeUtils.escapeSql(billingDate)+"',"+ "'"+StringEscapeUtils.escapeSql(invoiceCode)+"',"+ "'"+StringEscapeUtils.escapeSql(invoiceNumber)+"',"+ ""+invoiceType+","+ "'"+StringEscapeUtils.escapeSql(checkCode)+"',"+ "'"+StringEscapeUtils.escapeSql(seller)+"',"+ "'"+StringEscapeUtils.escapeSql(purchaser)+"',"+ "'"+StringEscapeUtils.escapeSql(purchaserTaxNo)+"',"+ "'"+StringEscapeUtils.escapeSql(salesTaxNo)+"',"+ ""+df.format(priceWithoutTax)+","+ ""+df.format(tax)+","+ ""+df.format(taxIncludedPrice)+","+ ""+0+","+ ""+userid+","+ ""+INVOICESOURCE_TAIZHANG+","+ ""+INIT_STATUS+","+ "'"+entryTime+"'"+ ")"; rs.execute(insert); sql = "select max(id) maxid from FnaInvoiceLedger"; rs.execute(sql); int maxid = 0; if(rs.next()){ maxid = Util.getIntValue(rs.getString("maxid")); } currentid = maxid; } String delete = "delete from FnaInvoiceLedgerDetail where mainid = "+currentid; rs.execute(delete); List insertList = new ArrayList(); for(int i = 0;i 0){//更新发票 insertList.add(currentid+"" + Util.getSeparator() + StringEscapeUtils.escapeSql(_invoiceServiceYype)+"" + Util.getSeparator() +df.format(_priceWithoutTax)+ Util.getSeparator()+df.format(_taxRate)+ Util.getSeparator()+df.format(_tax)); } } brs.executeSqlBatch("insert into FnaInvoiceLedgerDetail(mainid,invoiceServiceYype,priceWithoutTax,taxRate,tax) VALUES (?,?,?,?,?)", insertList); } catch (Exception e) { errorMsg.append(e.getMessage()); } JSONObject jsonObject = new JSONObject(); if(errorMsg.length() > 0){ jsonObject.put("code", false); jsonObject.put("msg", errorMsg.toString()); }else{ jsonObject.put("flag", true); } out.print(jsonObject.toString()); response.flushBuffer(); } /** * 判断当前发票是否可以被批量验票 * @param id * @return */ public String getInvoice_checkboxpopedom(String id){ RecordSet rs = new RecordSet(); String sql = "select requestid,checkStatus,invoiceType from FnaInvoiceLedger where id = "+id; rs.execute(sql); String requestid = ""; int checkStatus = 0; int invoiceType = 0; while(rs.next()){ requestid = Util.null2String(rs.getString("requestid")); checkStatus = Util.getIntValue(rs.getString("checkStatus")); invoiceType = Util.getIntValue(rs.getString("invoiceType")); } if(!"".equals(requestid) || checkStatus == 1 || (invoiceType != 1 && invoiceType != 2 && invoiceType != 15 && invoiceType != 20 && invoiceType != 16))return "false"; return "true"; } /** * 判断当前的企业名称和企业纳税人识别号是否为接口所有,如果是则不可以被删除,如果是发票所有,则可以删除 * @param type * @return */ public String getCompanyAndTaxpayerNumber_checkboxpopedom(String type){ if("1".equals(type)){ return "false"; }else{ return "true"; } } /** * 判断当前发票是否可以被删除或者验票 * @param id 删除、编辑、查看、打印 * @return */ public List getInvoice_popedom(String id,String otherParams){ String[] otherParamArray = otherParams.split("\\+"); String ifExistsInterface = otherParamArray[0]; int userid = Util.getIntValue(otherParamArray[1], 0); String canEditAll = otherParamArray[2]; //获取requestId int requestid = getRequestIdByInvoice(id); RecordSet rs = new RecordSet(); List resultList = new ArrayList(); rs.executeQuery("select checkStatus,invoiceType from FnaInvoiceLedger where id=?",id); int checkStatus = 0; int invoiceType = 0; while(rs.next()){ checkStatus = Util.getIntValue(rs.getString("checkStatus"),0); invoiceType = Util.getIntValue(rs.getString("invoiceType"),0); } if(requestid>0){ resultList.add("false"); resultList.add("false"); resultList.add("true"); }else if(checkStatus == 1){ resultList.add("true"); resultList.add("false"); resultList.add("true"); }else{ resultList.add("true"); resultList.add("true"); resultList.add("false"); } if((invoiceType==1 || invoiceType==2 || invoiceType==15 || invoiceType==20) && checkStatus == 1){ resultList.add("true"); }else{ resultList.add("false"); } resultList.add("true"); resultList.add("true"); //判断某个人是否仅仅只是个共享人 if (userid != 1 && !Boolean.parseBoolean(canEditAll)) { //能查看所有他就不仅仅是个共享人 boolean isOnlySharer = InvoiceSharerUtil.checkInvoiceShare(id, userid); if (isOnlySharer) { //依据上面的权限为主,如果上面权限可查看,则再加上当前限制(只有,查看,打印,导出,对应下标:2,3,4) for (int i = 0; i < resultList.size(); i++) { String isShow = resultList.get(i); if ("true".equals(isShow)) { if (i != 2 && i != 3 && i != 4) { resultList.set(i, "false"); } } } } } return resultList; } /** * 获取发票requestid * @param invoiceId * @return */ public static int getRequestIdByInvoice(String invoiceId){ RecordSet rs = new RecordSet(); int requestid=0; rs.executeQuery("select requestid from FnaInvoiceLedger where id=?",invoiceId); if(rs.next()){ requestid =Util.getIntValue(rs.getString("requestid"),0); } if(requestid<=0){ rs.executeQuery("select requestid from fnaInvoiceReimbursement where mainid=?",invoiceId); if(rs.next()){ requestid =Util.getIntValue(rs.getString("requestid"),0); } } return requestid; } /** * 发票是否可以删除 * @param invoiceIds * @return */ public static String canDeleteInvoice(boolean canEditAll,User user,String invoiceIds){ String msg = ""; try{ RecordSet rsQuery = FnaInvoiceCommon.executeInSql("select count(id) cnt from fnaInvoiceLedger where requestId>0 and id in(占位符标识)", invoiceIds, "executeQuery"); if (rsQuery.next()){ int cnt = Util.getIntValue(rsQuery.getString("cnt")); if(cnt>0) { throw new Exception(SystemEnv.getHtmlLabelName(529701,user.getLanguage())); } } RecordSet rs2Query = FnaInvoiceCommon.executeInSql("select count(id) cnt from fnaInvoiceReimbursement where requestId>0 and mainid in(占位符标识)", invoiceIds, "executeQuery"); if (rs2Query.next()){ int cnt = Util.getIntValue(rs2Query.getString("cnt")); if(cnt>0) { throw new Exception(SystemEnv.getHtmlLabelName(529701,user.getLanguage())); } } if(!canEditAll){ RecordSet rs3Query = FnaInvoiceCommon.executeInSql("select userId_new from fnaInvoiceLedger where id in(占位符标识)", invoiceIds, "executeQuery"); while (rs3Query.next()){ int userId_new = Util.getIntValue(rs3Query.getString("userId_new")); if(userId_new!=user.getUID()) { throw new Exception(SystemEnv.getHtmlLabelName(2012,user.getLanguage())); } } } }catch (Exception e){ msg = e.getMessage(); } return msg; } /** * 如果当前企业名称和纳税人识别号属于查验接口,则不可以编辑和删除 * @param id * @param type * @return */ public List getCompanyAndTaxpayerNumber_popedom(String id,String type){ List resultList = new ArrayList(); if("1".equals(type)){ resultList.add("false"); resultList.add("false"); resultList.add("true"); }else{ resultList.add("true"); resultList.add("true"); resultList.add("true"); } return resultList; } /** * 判断当前记录是否生效或关闭 * @param id * @param para * @return */ public List getInterface_popedom(String id,String para){ RecordSet rs = new RecordSet(); List resultList = new ArrayList(); String sql = "select status,interfaceType from fnainvoiceinterface where id = "+id; rs.execute(sql); int status = 0; int interfaceType=-1; if(rs.next()){ status = Util.getIntValue(rs.getString("status"),0); interfaceType = Util.getIntValue(rs.getString("interfaceType"),0); } resultList.add("true"); if(interfaceType==2){ resultList.add("false"); }else{ resultList.add("true"); } resultList.add("false"); resultList.add("false"); if(interfaceType==1){ resultList.add("true"); }else{ resultList.add("false"); } return resultList; } /** * 判断当前记录是否生效或关闭 * @param id * @param para * @return */ public String getInterface_checkboxpopedom(String id){ RecordSet rs = new RecordSet(); List resultList = new ArrayList(); rs.executeQuery("select interfaceType from fnainvoiceinterface where id =?",id); int interfaceType=-1; if(rs.next()){ interfaceType = Util.getIntValue(rs.getString("interfaceType"),0); } if(interfaceType==2){ return "false"; }else{ return "true"; } } /** * 判断已处理,未处理 * @param id * @param para * @return */ public List getHandleStatus_popedom(String id,String para){ RecordSet rs = new RecordSet(); List resultList = new ArrayList(); String sql = "select handleStatus from FnaInvoiceCheckFailLog where id = "+id; rs.execute(sql); int handleStatus = 0; if(rs.next()){ handleStatus = Util.getIntValue(rs.getString("handleStatus"),0); } if(handleStatus == 0){ resultList.add("true"); resultList.add("false"); }else{ resultList.add("false"); resultList.add("true"); } return resultList; } /** * 赋值发票信息(包括主表,明细表) * @param checkIds * @return */ public void getFnaInvoiceLedgerList(String checkIds,FnaAbstractInterface fnaAbstractInterface){ RecordSet rs = new RecordSet(); RecordSet rs2 = new RecordSet(); ArrayList arrayList = new ArrayList(); Map> detailMap = new HashMap>(); rs.execute("select * from FnaInvoiceLedger where id in ( "+checkIds+" 0 )"); while(rs.next()){ //查询发票主表信息 String invoiceNumber= Util.null2String(rs.getString("InvoiceNumber")); int id = Util.getIntValue(rs.getString("id")); FnaInvoiceLedger fnaInvoiceLedger = new FnaInvoiceLedger(); fnaInvoiceLedger.setId(id); fnaInvoiceLedger.setBillingDate(Util.null2String(rs.getString("BillingDate"))); fnaInvoiceLedger.setInvoiceCode(Util.null2String(rs.getString("InvoiceCode"))); fnaInvoiceLedger.setInvoiceNumber(invoiceNumber); fnaInvoiceLedger.setInvoiceType(Util.getIntValue(rs.getString("InvoiceType"))); fnaInvoiceLedger.setSeller(Util.null2String(rs.getString("Seller"))); fnaInvoiceLedger.setPurchaser(Util.null2String(rs.getString("Purchaser"))); fnaInvoiceLedger.setInvoiceServiceYype(Util.null2String(rs.getString("InvoiceServiceYype"))); fnaInvoiceLedger.setPriceWithoutTax(Util.getDoubleValue(rs.getString("PriceWithoutTax"))); fnaInvoiceLedger.setTaxRate(Util.getDoubleValue(rs.getString("TaxRate"))); fnaInvoiceLedger.setTax(Util.getDoubleValue(rs.getString("Tax"))); fnaInvoiceLedger.setTaxIncludedPrice(Util.getDoubleValue(rs.getString("TaxIncludedPrice"))); fnaInvoiceLedger.setAuthenticity(Util.getIntValue(rs.getString("Authenticity"))); fnaInvoiceLedger.setCheckStatus(Util.getIntValue(rs.getString("checkStatus"))); fnaInvoiceLedger.setCheckCode(Util.null2String(rs.getString("CheckCode"))); arrayList.add(fnaInvoiceLedger); //查询明细表信息 rs2.execute("select * from FnaInvoiceLedgerDetail where mainid = "+id); List detailList = new ArrayList(); while(rs2.next()){ FnaInvoiceLedgerDetail fnaInvoiceLedgerDetail = new FnaInvoiceLedgerDetail(); fnaInvoiceLedgerDetail.setInvoiceServiceYype(Util.null2String(rs2.getString("invoiceServiceYype"))); fnaInvoiceLedgerDetail.setPriceWithoutTax(Util.getDoubleValue(rs2.getString("priceWithoutTax"))); fnaInvoiceLedgerDetail.setTaxRate(Util.getDoubleValue(rs2.getString("taxRate"))); fnaInvoiceLedgerDetail.setTax(Util.getDoubleValue(rs2.getString("tax"))); detailList.add(fnaInvoiceLedgerDetail); } detailMap.put(invoiceNumber, detailList); } fnaAbstractInterface.setArrayList(arrayList); fnaAbstractInterface.setDetailMap(detailMap); } /** * 流程强制收回,退回,删除等操作时,修改发票状态为未冻结状态 * @param requestid */ public void doWfForceOver(int requestid) { doWfForceOver(requestid,"",new User(1)); } /** * 流程强制收回,退回,删除等操作时,修改发票状态为未冻结状态 * @param requestid */ public void doWfForceOver(int requestid,String ipAdress,User user){ //初始化发票状态 RecordSet rs = new RecordSet(); Map> mapCloud = new HashMap>();//其中key为userid_new, value为的List Map mapCloudOA = new HashMap();//其中key为invoiceId, value为的cloudId //添加日志 FnaLogSqlUtil fnaLogSqlUtil = new FnaLogSqlUtil(); Map> labelIdMaps = new HashMap>(); Map> beforeMaps = new HashMap>(); StringBuffer sqlBuffer = new StringBuffer(); rs.executeQuery("select * from fnainvoiceledger where requestid =?",requestid); while(rs.next()){ String invoiceId = Util.null2String(rs.getString("id")); String cloudId = Util.null2String(rs.getString("cloudId")); String userid_new = Util.null2String(rs.getString("userId_new")); if(mapCloud.containsKey(userid_new)){ List cloudIdList = mapCloud.get(userid_new); if(!cloudIdList.contains(cloudId)){ cloudIdList.add(cloudId); mapCloud.put(userid_new,cloudIdList); } }else{ List cloudIdList = new ArrayList<>(); cloudIdList.add(cloudId); mapCloud.put(userid_new,cloudIdList); } mapCloudOA.put(invoiceId,cloudId); //添加至日志map fnaLogSqlUtil.getActionInvoiceLogInfo(invoiceId,labelIdMaps,beforeMaps); if(sqlBuffer.length() > 0){ sqlBuffer.append(","); } sqlBuffer.append(invoiceId); } int workflowlogic = ReimbursementUtil.getWorkflowlogic(); StringBuffer invoiceIdBuffer = new StringBuffer(); if(workflowlogic==3) { rs.executeQuery("select b.id,b.cloudId,b.userId_new from FnaInvoiceReimbursement a join fnainvoiceledger b on a.mainid=b.id where a.requestid = ?",requestid); while (rs.next()){ String invoiceId = Util.null2String(rs.getString("id")); String cloudId = Util.null2String(rs.getString("cloudId")); String userid_new = Util.null2String(rs.getString("userId_new")); if(mapCloud.containsKey(userid_new)){ List cloudIdList = mapCloud.get(userid_new); if(!cloudIdList.contains(cloudId)){ cloudIdList.add(cloudId); mapCloud.put(userid_new,cloudIdList); } }else{ List cloudIdList = new ArrayList<>(); cloudIdList.add(cloudId); mapCloud.put(userid_new,cloudIdList); } mapCloudOA.put(invoiceId,cloudId); fnaLogSqlUtil.getActionInvoiceLogInfo(invoiceId,labelIdMaps,beforeMaps); if(invoiceIdBuffer.length()==0){ invoiceIdBuffer.append(invoiceId); }else{ invoiceIdBuffer.append(",").append(invoiceId); } } } //发票云报销修改发票云数据 RecordSet rs5= new RecordSet(); for(Map.Entry> entry : mapCloud.entrySet()){ String userid_new = entry.getKey(); List cloudIdList = entry.getValue();//发票id int userid_newInt = Util.getIntValue(Util.null2String(userid_new),0); JSONObject interfaceInfo = InvoiceCloudUtil.getInterfaceInfo(new User(userid_newInt), false, false, true); JSONObject cloudInfo = interfaceInfo.getJSONObject("cloud"); boolean existEffectCloud = cloudInfo.getBoolean("existEffectCloud"); if(existEffectCloud){ String cid = Util.null2String(cloudInfo.getString("cid")); String userName = Util.null2String(cloudInfo.getString("userName")); String password = Util.null2String(cloudInfo.getString("password")); String aesKey = Util.null2String(cloudInfo.getString("aesKey")); String reimburseUrl = Util.null2String(cloudInfo.getString("reimburseUrl")); JSONObject bodyJson = new JSONObject(); bodyJson.put("cid",cid); bodyJson.put("userId",user.getUID()); bodyJson.put("flag","2"); JSONArray fnaInvoiceReimburseInfoJa = new JSONArray(); if(workflowlogic==3){ rs5.executeQuery("select * from FnaInvoiceReimbursement where requestid=?",requestid); while (rs5.next()){ String cloudId = mapCloudOA.get(Util.null2String(rs5.getString("mainid"))); if(cloudIdList.contains(cloudId)) { JSONObject fnaInvoiceReimburseInfoJo = new JSONObject(); fnaInvoiceReimburseInfoJo.put("dataid", requestid); fnaInvoiceReimburseInfoJo.put("amount", ""); fnaInvoiceReimburseInfoJo.put("uid", ""); fnaInvoiceReimburseInfoJo.put("date", ""); fnaInvoiceReimburseInfoJo.put("name", ""); fnaInvoiceReimburseInfoJo.put("fid", cloudId); fnaInvoiceReimburseInfoJo.put("cid", cid); fnaInvoiceReimburseInfoJa.add(fnaInvoiceReimburseInfoJo); } } }else{ rs5.executeQuery("select * from fnaInvoiceLedger where requestid=?",requestid); while (rs5.next()){ String cloudId = Util.null2String(rs5.getString("cloudId")); if(cloudIdList.contains(cloudId)) { JSONObject fnaInvoiceReimburseInfoJo = new JSONObject(); fnaInvoiceReimburseInfoJo.put("dataid", requestid); fnaInvoiceReimburseInfoJo.put("amount", ""); fnaInvoiceReimburseInfoJo.put("uid", ""); fnaInvoiceReimburseInfoJo.put("date", ""); fnaInvoiceReimburseInfoJo.put("name", ""); fnaInvoiceReimburseInfoJo.put("fid", cloudId); fnaInvoiceReimburseInfoJo.put("cid", cid); fnaInvoiceReimburseInfoJa.add(fnaInvoiceReimburseInfoJo); } } } bodyJson.put("infos",fnaInvoiceReimburseInfoJa); bodyJson.put("sreim","0"); try { JSONObject reimburseJson = InvoiceCloudUtil.reimburseInvoice(reimburseUrl, aesKey, bodyJson, userName, password, "解锁报销修改数据"); if(!reimburseJson.getBoolean("flag")){ throw new Exception(reimburseJson.getString("msg")); } }catch (Exception e){ new BaseBean().writeLog("解锁报销修改数据错误:"+e.getMessage()); } } } if(sqlBuffer.length()>0){ String updateInvoceStatus = "update fnainvoiceledger set status = "+FnaInvoiceCommon.INIT_STATUS+",reimbursementDate=NULL,requestid=NULL,reimbursePerson=NULL "+ " where id in ("+sqlBuffer.toString()+")"; rs.executeUpdate(updateInvoceStatus); } //去重校验控制逻辑 if(workflowlogic==3) { if(invoiceIdBuffer.length()>0){ FnaInvoiceCommon.executeInSql("update fnainvoiceledger set status = "+FnaInvoiceCommon.INIT_STATUS+",reimbursementDate=NULL,requestid=NULL,reimbursePerson=NULL " + " where id in(占位符标识)",invoiceIdBuffer.toString(),"executeUpdate"); } rs.executeUpdate("delete from FnaInvoiceReimbursement where requestid = ?", requestid); } //更新日志信息 for (Map.Entry> entry : labelIdMaps.entrySet()) { String invoiceId = entry.getKey(); Map labelIdMap = entry.getValue(); Map beforeMap = beforeMaps.get(invoiceId); //插入日志2 Map afterMap =fnaLogSqlUtil.getInvoiceMap(invoiceId,labelIdMap); fnaLogSqlUtil.invoiceLedgerAddlog(user,ipAdress,"2",invoiceId,"4", beforeMap,afterMap,labelIdMap); } } /** * 获取发票信息入口 * @param jsonObject * @param userid * @return */ public String getInfoEntrance(JSONObject jsonObject,int userid){ String entryTime = Util.date(2);//录入时间 DecimalFormat df = new DecimalFormat("#######################0.00"); RecordSet rs = new RecordSet(); try{ JSONArray jsonArray = jsonObject.getJSONArray("info"); writeLog("jsonArray:", jsonArray); Iterator iterator = jsonArray.iterator(); StringBuffer param = new StringBuffer(); param.append("{\"item_list\": ["); int count = 0; HashMap cardMap = new HashMap(); while(iterator.hasNext()){ JSONObject json = (JSONObject)iterator.next(); String card_id = json.getString("card_id"); String encrypt_code = json.getString("encrypt_code"); //判断此card_id是否已经在表中存在,已经同步过的不需要同步 if(judgeCardId(card_id,encrypt_code,rs)){ continue; } if(count > 0){ param.append(","); } cardMap.put(card_id+"_index"+count, encrypt_code); param.append("{\"card_id\":\""+card_id+"\",").append("\"encrypt_code\":\""+encrypt_code+"\"}"); count ++; } param.append("]}"); String token = getAccessToken(); if("".equals(token)){ return ""+ SystemEnv.getHtmlLabelName(10003158,weaver.general.ThreadVarLanguage.getLang())+"token"+ SystemEnv.getHtmlLabelName(498,weaver.general.ThreadVarLanguage.getLang())+"!"; } writeLog("token:", token); writeLog("param:", param); JSONObject invoiceInfoJson = getElecInvoiceInfoBatch(param.toString(), token); writeLog("invoiceInfoJson:", invoiceInfoJson); String errorMsg = Util.null2String(invoiceInfoJson.get("errorMsg")); //判断调用方法时是否存在错误 if(!"".equals(errorMsg)){ return invoiceInfoJson.getString("errorMsg"); } //判断返回结果是否错误 String errcode = invoiceInfoJson.getString("errcode"); if(!"0".equals(errcode)){ String errmsg = invoiceInfoJson.getString("errmsg"); return CONCURRENT_HASH_MAP.containsKey(errcode) ? CONCURRENT_HASH_MAP.get(errcode):errmsg; } JSONArray jsonArrayItem_list = invoiceInfoJson.getJSONArray("item_list"); Iterator iteratorItem_list = jsonArrayItem_list.iterator(); count = 0; while(iteratorItem_list.hasNext()){ JSONObject json = (JSONObject)iteratorItem_list.next(); String card_id = json.getString("card_id"); String openid = json.getString("openid"); String encrypt_code = cardMap.get(card_id+"_index"+count); String seller = json.getString("payee");//销售方 JSONObject user_info = json.getJSONObject("user_info"); String billingDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date(user_info.getLong("billing_time")*1000));//开票日期 String invoiceNumber = user_info.getString("billing_code");//发票号码 String invoiceCode = user_info.getString("billing_no");//发票代码 String purchaser = user_info.getString("title");//购买方 String checkcode = user_info.getString("check_code");//校验码 //这两个字段不一定在json中存在 String priceWithoutTax = "0.00";//金额(不含税价) if(user_info.containsKey("fee_without_tax")){ priceWithoutTax = df.format(Double.parseDouble(user_info.getString("fee_without_tax"))/100); } String tax = "0.00";//税额(税价) if(user_info.containsKey("tax")){ tax = df.format(Double.parseDouble(user_info.getString("tax"))/100); } String taxIncludedPrice = df.format(Double.parseDouble(user_info.getString("fee"))/100);//价税合计 String taxRate = "0.00";//税率 if(!"0.00".equals(priceWithoutTax)){ taxRate = getRoundNumber((Double.parseDouble(tax) / Double.parseDouble(priceWithoutTax)) * 100); } @SuppressWarnings("unused") String pdf_url = user_info.getString("pdf_url");//这张发票对应的PDF_URL // new BaseBean().writeLog("pdf_url:", pdf_url); /** * INVOICE_REIMBURSE_INIT 发票初始状态,未锁定,可提交报销 * INVOICE_REIMBURSE_LOCK 发票已锁定,无法重复提交报销 * INVOICE_REIMBURSE_CLOSURE 发票已核销,从用户卡包中移除 */ String reimburse_status = user_info.getString("reimburse_status");//发票报销状态 //只有未冻结的发票才能被选到,默认为0 int status = INIT_STATUS; String invoiceServiceYype = "";//货物或应税服务类型 JSONArray infoArray = user_info.getJSONArray("info"); for(int arr=0;arr labelIdMap = new HashMap(); Map beforeMap = new HashMap(); int invoiceId = InvoiceUtil.getInvoiceId(invoiceNumber,invoiceCode); Map afterMap =fnaLogSqlUtil.getInvoiceMap(String.valueOf(invoiceId),labelIdMap); fnaLogSqlUtil.invoiceLedgerAddlog(new User(userid),"","0",String.valueOf(invoiceId),"0", beforeMap,afterMap,labelIdMap); } count++; } }catch(Exception e){ return e.getMessage(); } return ""; } /** * 更新发票状态 * @param invoiceAmtMap * @param requestid * @param userid 流程创建人 * @param doubleCheckInvoiceList * @param type * @param user 当前人员 * @param ipAdress * @throws Exception */ public void changeStatusEntrance(Map invoiceAmtMap,String requestid,int userid,ArrayList doubleCheckInvoiceList,String type,User user,String ipAdress) throws Exception{ RecordSet rs = new RecordSet(); try { for(Map.Entry entry : invoiceAmtMap.entrySet()) { String invoiceId = entry.getKey(); double canReimbursementAmt = ReimbursementUtil.getCanReimbursementAmt(invoiceId); //选择了一张发票的情况下 if(doubleCheckInvoiceList.contains(invoiceId)){ double reimbursementAmt = entry.getValue(); String updateInvoceStatus = ""; if(reimbursementAmt < canReimbursementAmt) { updateInvoceStatus = "update fnainvoiceledger set status = "+FnaInvoiceCommon.INIT_STATUS+",reimbursementDate=NULL,requestid=NULL,reimbursePerson=NULL "+ " where id = ? "; }else if(reimbursementAmt == canReimbursementAmt){ if("lock".equals(type)){ updateInvoceStatus = "update fnainvoiceledger set status = "+FnaInvoiceCommon.LOCK_STATUS+",reimbursementDate=NULL,requestid=NULL,reimbursePerson=NULL "+ " where id = ? "; }else{ updateInvoceStatus = "update fnainvoiceledger set status = "+FnaInvoiceCommon.CLOSURE_STATUS+",reimbursementDate=NULL,requestid=NULL,reimbursePerson=NULL "+ " where id = ? "; } } rs.executeUpdate(updateInvoceStatus,invoiceId); rs.executeUpdate("insert into FnaInvoiceReimbursement(mainid,requestid,reimbursementAmt,reimbursementDate,userid) values (?,?,?,?,?)", invoiceId,requestid,reimbursementAmt,new SimpleDateFormat("yyyy-MM-dd").format(new Date()),userid); }else{//选择多张发票的情况下,全额报销 String updateInvoceStatus = ""; if("lock".equals(type)){ updateInvoceStatus = "update fnainvoiceledger set status = "+FnaInvoiceCommon.LOCK_STATUS+",reimbursementDate=NULL,requestid=NULL,reimbursePerson=NULL "+ " where id = ? "; }else{ updateInvoceStatus = "update fnainvoiceledger set status = "+FnaInvoiceCommon.CLOSURE_STATUS+",reimbursementDate=NULL,requestid=NULL,reimbursePerson=NULL "+ " where id = ? "; } rs.executeUpdate(updateInvoceStatus,invoiceId); rs.executeUpdate("insert into FnaInvoiceReimbursement(mainid,requestid,reimbursementAmt,reimbursementDate,userid) values (?,?,?,?,?)", invoiceId,requestid,canReimbursementAmt,new SimpleDateFormat("yyyy-MM-dd").format(new Date()),userid); } } } catch (Exception e) { throw new Exception(e.getMessage()); } } /** * 获取验票接口 * @param user * @throws Exception */ /*public FnaAbstractInterface getInterface(User user) throws Exception{ int baiwangtype = Util.getIntValue(getPropValue("baiwang", "type"),0); FnaInvoiceCommon.getinterface(); String Type = FnaInvoiceInterface.getInstance().getType(); FnaAbstractInterface fnaAbstractInterface = null; if("1".equals(Type)){//国信接口 fnaAbstractInterface = new FnaBaiwangOpenApi(user); }else if("2".equals(Type)){//百望接口 if(baiwangtype == 0){ fnaAbstractInterface = new FnaBaiwangOpenApi(user); }else { fnaAbstractInterface = new FnaBaiwangOpenApi(user); } }else{ throw new Exception(SystemEnv.getHtmlLabelName(520790,user.getLanguage()));//后台【预算】-【发票管理】-【发票接口配置】未配置生效的增值税发票查验接口! } fnaAbstractInterface.setUser(user); return fnaAbstractInterface; }*/ /** * 获取验票接口 * @param user * @throws Exception */ public FnaAbstractInterface getInterface(User user) throws Exception{ FnaAbstractInterface fnaAbstractInterface = new FnaBaiwangOpenApi(user); fnaAbstractInterface.setUser(user); return fnaAbstractInterface; } /** * 获取发票参数 * @param invoiceId * @param rs * @return */ public String[] getInvoiceInfoParam(String invoiceId,RecordSet rs){ String[] params = new String[4]; String sql = "select invoiceSource_new,card_id_new,encrypt_code_new,openid_new from FnaInvoiceLedger where id="+invoiceId; rs.execute(sql); String invoiceSource = ""; String card_id = ""; String encrypt_code = ""; String openid_new = ""; while(rs.next()){ invoiceSource = Util.null2String(rs.getString("invoiceSource_new")); card_id = Util.null2String(rs.getString("card_id_new")); encrypt_code = Util.null2String(rs.getString("encrypt_code_new")); openid_new = Util.null2String(rs.getString("openid_new")); } params[0] = invoiceSource; params[1] = card_id; params[2] = encrypt_code; params[3] = openid_new; return params; } /** * 查询电子发票信息 * @param param * @return */ public JSONObject getElecInvoiceInfoBatch(String param,String token){ String httpUrl = GETINVOICEINFOBATCH_URL + token; return httpRequest(httpUrl,param); } /** * 更新发票状态 * @param param * @param token * @return */ public JSONObject updateElecInvoiceStatus(String param,String token){ String httpUrl = UPDATEINVOICESTATUS_URL + token; return httpRequest(httpUrl,param); } /** * 调用微信接口通用方法 * @param requestUrl * @param param * @return */ @SuppressWarnings(value={"resource"}) public JSONObject httpRequest(String requestUrl,String param){ JSONObject jsonObject = new JSONObject(); HttpClient httpClient = new DefaultHttpClient(); HttpPost post = new HttpPost(requestUrl); try { if(param != null){ StringEntity postingString = new StringEntity(param); post.setEntity(postingString); post.setHeader("Content-type", "application/json"); } HttpResponse response = httpClient.execute(post); String content = EntityUtils.toString(response.getEntity()); jsonObject = JSONObject.fromObject(content); } catch (Exception e) { jsonObject.put("errorMsg", e.getMessage()); } return jsonObject; } /** * 四舍五入 * @param number * @return */ public String getRoundNumber(double number){ DecimalFormat df = new DecimalFormat("################################0.00"); if(number == 0){ return "0.00"; } return df.format(((double)Math.round(number))); } /** * 获取token * @return */ public String getAccessToken() throws Exception{ Map params = new HashMap(); params.put("corpId", corpId); String appStr = APPManager.getThirdAccessToken(params); new BaseBean().writeLog("appStr:", appStr); JSONObject jsonObject = JSONObject.fromObject(appStr); String errcode = Util.null2String(jsonObject.get("errcode")); String access_token = ""; if("0".equals(errcode)){ access_token = jsonObject.getString("accessToken"); }else{ throw new Exception(jsonObject.getString("errmsg")); } new BaseBean().writeLog("access_token:", access_token); return access_token; } /** * 删除电子发票 * @param card_id * @param rs */ public void deleteCardId(String card_id,RecordSet rs){ String sql = "delete from FnaInvoiceLedger where card_id='"+StringEscapeUtils.escapeSql(card_id)+"'"; rs.execute(sql); } /** * 判断card_id是否存在 * @param card_id * @param encrypt_code * @param rs * @return */ public boolean judgeCardId(String card_id,String encrypt_code,RecordSet rs){ String sql = "select 1 from fnaInvoiceLedger where card_id_new = '"+StringEscapeUtils.escapeSql(card_id)+"' and encrypt_code_new = '"+StringEscapeUtils.escapeSql(encrypt_code)+"' "; rs.execute(sql); if(rs.next()){ return true; } return false; } /** * 判断扫描的发票是否在表中已经存在(发票号码),之前很多方法不用了,为保证不报错,选择重载 * @param invoiceNumber * @param rs * @return */ public boolean ifExist(String invoiceNumber,RecordSet rs){ String sql = "select 1 from fnaInvoiceLedger where invoiceNumber = '"+StringEscapeUtils.escapeSql(invoiceNumber)+"'"; rs.execute(sql); if(rs.next()){ return true; } return false; } /** * 判断扫描的发票是否在表中已经存在(发票代码和发票号码) * @param invoiceNumber * @param rs * @return */ public boolean ifExist(String invoiceNumber,String invoiceCode, RecordSet rs){ String sql = "select 1 from fnaInvoiceLedger where invoiceNumber = ? and invoiceCode = ? "; rs.executeQuery(sql, invoiceNumber,invoiceCode); if(rs.next()){ return true; } return false; } /** * 判断扫描的发票是否在表中已经存在(发票代码和发票号码),并且发票为有效已查验、有效未查验 * @param invoiceNumber * @param rs * @return */ public boolean ifExistAuthenticity(String invoiceNumber,String invoiceCode, RecordSet rs){ String sql = "select 1 from fnaInvoiceLedger where invoiceNumber = ? and invoiceCode = ? and (checkStatus =1 or checkStatus=2) "; rs.executeQuery(sql, invoiceNumber,invoiceCode); if(rs.next()){ return true; } return false; } /** * 判断扫描的发票是否在表中已经存在(发票代码和发票号码),并且发票为有效已查验 * @param invoiceNumber * @param rs * @return */ public boolean ifExistAuthenticity2(String invoiceNumber,String invoiceCode, RecordSet rs){ String sql = "select 1 from fnaInvoiceLedger where invoiceNumber = ? and invoiceCode = ? and checkStatus =1"; rs.executeQuery(sql, invoiceNumber,invoiceCode); if(rs.next()){ return true; } return false; } /** * 获取配置的自动验票地址 * @return */ public static void getinterface(){ RecordSet rs = new RecordSet(); rs.execute("select * from fnainvoiceinterface where (type = 1 or (type = 2 and interfaceType = 1)) and status = 1"); if(rs.next()){ String type = Util.null2String(rs.getString("type")); String interfaceurl = Util.null2String(rs.getString("interfaceurl")); String userName = Util.null2String(rs.getString("userName")); String password = Util.null2String(rs.getString("password")); FnaInvoiceInterface.getInstance().setType(type); FnaInvoiceInterface.getInstance().setInterfaceurl(interfaceurl); FnaInvoiceInterface.getInstance().setUserName(userName); FnaInvoiceInterface.getInstance().setPassword(password); }else{ FnaInvoiceInterface.getInstance().setType(""); FnaInvoiceInterface.getInstance().setInterfaceurl(""); FnaInvoiceInterface.getInstance().setUserName(""); FnaInvoiceInterface.getInstance().setPassword(""); } } /** * 压缩上传的图片,图片的大小大于2.5M时,进行图片压缩 * @param imageBytes * @return */ public byte[] compressImage(byte[] imageBytes){ ByteArrayInputStream byteArrayInputStream = null; ByteArrayOutputStream byteArrayOutputStream = null; try { double quality = 1d; while(quality >= 0){ byteArrayInputStream = new ByteArrayInputStream(imageBytes); byteArrayOutputStream = new ByteArrayOutputStream(); //压缩图片 Thumbnails.of(byteArrayInputStream).scale(1).outputQuality(quality).toOutputStream(byteArrayOutputStream); if(byteArrayOutputStream.toByteArray().length <= MAX_BYTES){ break; } //压缩之后图片还是大于2.5M,继续压缩 quality = quality - DIMINISHING_INTERVAL; } writeLog("压缩质量:",quality); } catch (Exception e) { writeLog("压缩出现错误:", e.getMessage()); } finally { try { if(byteArrayInputStream!=null) byteArrayInputStream.close(); if(byteArrayOutputStream!=null) byteArrayOutputStream.close(); } catch (Exception e) { writeLog("出现错误:", e.getMessage()); } } return byteArrayOutputStream.toByteArray(); } /** * 获取发票图片 * @param imageID * @param canEditAll * @param userid * @return */ public String getImageBase64(int imageID,boolean canEditAll,int userid){ if(imageID>0){ RecordSet rs = new RecordSet(); rs.executeQuery("select id from FnaInvoiceLedger where imageID = ?", imageID); int invoiceId = 0; if(rs.next()){ invoiceId = Util.getIntValue(rs.getString("id")); } if(getInvoicePermission(invoiceId, canEditAll, userid)){ return changeFileTobase64(ImageFileManager.getInputStreamById(imageID)); } } return "-1"; } /** * 查看发票权限 * @param invoiceId * @param canEditAll * @param userid * @return */ public boolean getInvoicePermission(int invoiceId,boolean canEditAll,int userid){ boolean canView = false; if(invoiceId>0){ canView = canEditAll; if(!canView){ RecordSet rs = new RecordSet(); rs.executeQuery("select 1 from fnaInvoiceLedger where (userid_new = ? or id in ( select invoiceId from fnaInvoiceSharer where sharer = ? )) and id = ?", userid, userid, invoiceId); if(rs.next()){ canView = true; }else{ String sql=" select count(*) cnt " + " from workflow_currentoperator a " + " join FnaInvoiceLedger b on a.requestid = b.requestid " + " where b.id =? and a.userid in("; //通过userid查询该userid关联的所有主从账号id List sqlList = new ArrayList(); sqlList.add(String.valueOf(invoiceId)); List useridList = getAllUserid(String.valueOf(userid)); for(int i=0;i 0){ canView = true; } if(!canView){ //去重校验控制逻辑 int workflowlogic = ReimbursementUtil.getWorkflowlogic(); if(workflowlogic==3) { sql=" select count(*) cnt "+ " from workflow_currentoperator a "+ " join FnaInvoiceReimbursement b on a.requestid = b.requestid "+ " where b.mainid = ? and a.userid in("; //通过userid查询该userid关联的所有主从账号id sqlList.clear(); sqlList.add(String.valueOf(invoiceId)); for(int i=0;i 0){ canView = true; } } } } } } return canView; } /** * 通过一个账号获取管理的所有的主从账号 * @param userid * @return */ public List getAllUserid(String userid){ List list = new ArrayList(); try{ ResourceComInfo resourceComInfo = new ResourceComInfo(); ResourceBelongtoComInfo resourceBelongtoComInfo = new ResourceBelongtoComInfo(); String accountType = resourceComInfo.getAccountType(userid); if("0".equals(accountType) || "".equals(accountType)){//主账号 List userList = resourceBelongtoComInfo.getBelongtousers(userid);//获取所有次账号 for(int i=0;i>> 4 & 0xf]; str[k++] = hexDigits[byte0 & 0xf]; } return new String(str); } catch (Exception e) { e.printStackTrace(); return null; } } /** * 补全校验码 * @param checkCode * @return */ @Deprecated public String addCheckCode(String checkCode){ int length = checkCode.length(); int add = 20 - length; StringBuffer addbuffer = new StringBuffer(); for(int i = 0;i invoiceTypeList = Arrays.asList(invoiceTypes.split(",")); boolean vatExistInWhiltList = false;//增值税连号发票控制当前用户是否已维护于白名单 boolean otherExistInWhiltList = false;//其他连号发票控制当前用户是否已维护于白名单 if (vatCtrl==1) { vatExistInWhiltList = this.existInWhiltList(user, 1); } if (otherCtrl==1) { otherExistInWhiltList = this.existInWhiltList(user, 2); } //查询出所有例外的发票 List exceptInvoiceList = new ArrayList(); rs.executeQuery("select invoiceId from fnaExceptInvoice"); while (rs.next()){ exceptInvoiceList.add(Util.null2String(rs.getString("invoiceId"))); } //查询出需要校验是否连号的发票信息发票号码+发票代码,用 List invoiceLedgerList = new ArrayList(); if(vatCtrl==1 || otherCtrl==1) { rs.executeQuery("select id,invoiceNumber,invoiceCode,invoiceType from fnaInvoiceLedger where id in(" + StringEscapeUtils.escapeSql(invoiceIds) + ")"); while (rs.next()) { String id = Util.null2String(rs.getString("id")); String invoiceNumber = Util.null2String(rs.getString("invoiceNumber")); String invoiceCode = Util.null2String(rs.getString("invoiceCode")); int invoiceType = Util.getIntValue(rs.getString("invoiceType")); //如果开启了增值税发票连号控制,并且当前发票是增值税发票 if(vatCtrl==1 && (invoiceType==1 || invoiceType==2 || invoiceType==15 || invoiceType==16 || invoiceType==20 || invoiceType==21)){ //如果当前人员不在把增值税发票连号控制白名单内,并且当前发票不在例外列表中 if(!vatExistInWhiltList && !exceptInvoiceList.contains(id)){ FnaInvoiceLedger fnaInvoiceLedger = new FnaInvoiceLedger(); fnaInvoiceLedger.setInvoiceNumber(invoiceNumber); fnaInvoiceLedger.setInvoiceCode(invoiceCode); fnaInvoiceLedger.setInvoiceType(invoiceType); invoiceLedgerList.add(fnaInvoiceLedger); } } //如果开启了其他类型发票连号控制,并且当前发票是非增值税发票 if(otherCtrl==1 && invoiceType!=1 && invoiceType!=2 && invoiceType!=15 && invoiceType!=16 && invoiceType!=20 && invoiceType!=11){ if(invoiceTypeList.contains(String.valueOf(invoiceType))){ //如果当前人员不在把增值税发票连号控制白名单内,并且当前发票不在例外列表中 if(!otherExistInWhiltList && !exceptInvoiceList.contains(id)){ FnaInvoiceLedger fnaInvoiceLedger = new FnaInvoiceLedger(); fnaInvoiceLedger.setInvoiceNumber(invoiceNumber); fnaInvoiceLedger.setInvoiceCode(invoiceCode); fnaInvoiceLedger.setInvoiceType(invoiceType); invoiceLedgerList.add(fnaInvoiceLedger); } } } } } StringBuffer serialInvoice = new StringBuffer(); for(FnaInvoiceLedger fnaInvoiceLedger :invoiceLedgerList){ String invoiceNumber = fnaInvoiceLedger.getInvoiceNumber(); String invoiceCode = fnaInvoiceLedger.getInvoiceCode(); int invoiceType = fnaInvoiceLedger.getInvoiceType(); //可以用来判断发票是否连号的发票号码一定是数字 int number = 0; try{ number = Integer.valueOf(invoiceNumber); }catch (Exception e){ continue; } int beforeNumber = number - 1; int afterNumber = number + 1; rs.executeQuery("select id from fnaInvoiceLedger where invoiceType=? and invoiceCode=? and (invoiceNumber=? or invoiceNumber=?)", invoiceType, invoiceCode, beforeNumber, afterNumber); if (rs.next()) { if (serialInvoice.length() == 0) { serialInvoice.append(invoiceNumber); } else { serialInvoice.append(" ").append(invoiceNumber); } } } if(serialInvoice.length()>0){ serialInvoiceJson.put("status",false); serialInvoiceJson.put("msg",SystemEnv.getHtmlLabelName(516385,user.getLanguage()).replace("aaaaaaaa",serialInvoice.toString())); }else{ serialInvoiceJson.put("status",true); } }catch( Exception e){ serialInvoiceJson.put("status",false); serialInvoiceJson.put("msg",e.getMessage()); } return serialInvoiceJson; } /** * 判断用户是否已经在白名单中维护了 * @param user * @param serialInvoiceType 连号发票类型 1增值税 2其他 * @return */ public boolean existInWhiltList(User user,int serialInvoiceType) throws Exception { RecordSet rs = new RecordSet(); RecordSet rs2 = new RecordSet(); ResourceComInfo resourceComInfo = new ResourceComInfo(); DepartmentComInfo departmentComInfo = new DepartmentComInfo(); SubCompanyComInfo subCompanyComInfo = new SubCompanyComInfo(); boolean exist = false; int seclevel=Util.getIntValue(user.getSeclevel()); String userId = String.valueOf(user.getUID()); String userDepartment = String.valueOf(user.getUserDepartment()); String userSubCompany1 = String.valueOf(user.getUserSubCompany1()); rs.executeQuery("select * from fnaInvoiceWhiteList where serialInvoiceType=?",serialInvoiceType); while (rs.next()){ int orgType = Util.getIntValue(rs.getString("orgType"),0);//组织结构类型 1人力资源,2部门,3分部,4角色,5岗位,6所有人 String orgIds = Util.null2String(rs.getString("orgIds"));//组织结构ID List orgIdsList = Arrays.asList(orgIds.split(",")); int startSecurityLevel = Util.getIntValue(rs.getString("startSecurityLevel"),0);//开始安全级别 针对于部门、分部、角色、所有人 int endSecurityLevel = Util.getIntValue(rs.getString("endSecurityLevel"),0);//结束安全级别 针对于部门、分部、角色、所有人 默认值100 //String includeSubordinates = Util.null2String(rs.getString("includeSubordinates"));//是否包含下级,针对于部门和分部 1包含,0不含包 //String roleLevel = Util.null2String(rs.getString("roleLevel"));//角色级别 1部门,2分部,3总部 //String jobLevel = Util.null2String(rs.getString("jobLevel"));//岗位级别 1总部,2指定分部,3指定部门 //String jobDesignOrgIds = Util.null2String(rs.getString("jobDesignOrgIds"));//岗位指定的分部或者部门 if(orgType==1){//人力资源 if(orgIdsList.contains(userId)){ exist = true; break; } }else if(orgType==2){//部门 if(orgIdsList.contains(userDepartment) && seclevel>=startSecurityLevel && seclevel<=endSecurityLevel){ exist = true; break; } }else if(orgType==3){//分部 if(orgIdsList.contains(userSubCompany1) && seclevel>=startSecurityLevel && seclevel<=endSecurityLevel){ exist = true; break; } }else if(orgType==6){//所有人 if(seclevel>=startSecurityLevel && seclevel<=endSecurityLevel){ exist = true; break; } } } return exist; } /** * 流程上传识别发票图片 * @param fileids 文件fileid集合 * @throws Exception */ public static byte[] invoiceIdentifyFormWorkflow(String imagefileid) throws Exception{ RecordSet rs = new RecordSet(); //发票ids InputStream inputStream = ImageFileManager.getInputStreamById(Util.getIntValue(imagefileid)); FnaInvoiceCommon fnaInvoiceCommon = new FnaInvoiceCommon(); String fileData = fnaInvoiceCommon.changeFileTobase64(inputStream); if(fileData.contains("data:image/jpeg;base64,")){//为图片 fileData = fileData.replaceFirst("data:image/jpeg;base64,", ""); }else if(fileData.contains("data:image/png;base64,")){//为png fileData = fileData.replaceFirst("data:image/png;base64,", ""); }else if(fileData.contains("data:image/gif;base64,")){//为gif fileData = fileData.replaceFirst("data:image/gif;base64,", ""); }else if(fileData.contains("data:application/pdf;base64,")){//为pdf fileData = fileData.replaceFirst("data:application/pdf;base64,", ""); } byte[] imageBytes = ImageUtil.transformImage(fileData); return imageBytes; } /** * * @Title: getInvoiceIdByCheck * @Description: 验票 * @param: @param invoiceInfo * @param: @param user * @param: @return * @param: @throws Exception * @return: String * @throws */ public static JSONObject getInvoiceIdByCheck(JSONObject invoiceInfo,User user,String ipAdress) throws Exception{ String invoiceId = ""; String invoiceNumber = ""; JSONObject returnObj = new JSONObject(); try{ RecordSet rs = new RecordSet(); if(invoiceInfo.containsKey("invoiceId")){ invoiceId = invoiceInfo.getString("invoiceId"); } boolean isauthenticity = false; String invoiceCode = ""; String priceWithoutTax = ""; String checkcode = ""; String billingDate = ""; int userid_new = 0; String invoicestatus = ""; String invoiceType = invoiceInfo.getString("invoiceType"); if(!"".equals(invoiceId)){ String authenticity = ""; String sql = "select id,billingDate,taxIncludedPrice,invoiceType,checkCode,invoiceCode,userid_new,authenticity,invoiceNumber,status from fnaInvoiceLedger where id = ? "; rs.executeQuery(sql, invoiceId); if(rs.next()){ billingDate = Util.null2String(rs.getString("billingDate")); priceWithoutTax = Util.null2String(rs.getString("taxIncludedPrice")); checkcode = Util.null2String(rs.getString("checkCode")); userid_new = Util.getIntValue(rs.getString("userid_new")); authenticity = Util.null2String(rs.getString("authenticity")); invoiceNumber = Util.null2String(rs.getString("invoiceNumber")); invoiceCode = Util.null2String(rs.getString("invoiceCode")); invoicestatus = Util.null2String(rs.getString("status")); } if("1".equals(authenticity)){ isauthenticity = true; } }else{ JSONObject inv = invoiceInfo.getJSONObject("invoiceInfo"); if(inv.containsKey("pretax_amount")){ priceWithoutTax =inv.getString("pretax_amount"); } if(inv.containsKey("code")){ invoiceCode =inv.getString("code"); } if(inv.containsKey("number")){ invoiceNumber =inv.getString("number"); } checkcode =""; if((!"10100".equals(invoiceType))&&inv.containsKey("check_code")){ checkcode = inv.getString("check_code"); } String[] invoiceData = getInvoiceData(invoiceNumber,invoiceCode); isauthenticity = "1".equals(invoiceData[7]); userid_new = Util.getIntValue(invoiceData[6]); invoiceId = invoiceData[3]; billingDate = invoiceData[0]; invoicestatus = invoiceData[8]; } if("1".equals(invoicestatus)){ throw new Exception(SystemEnv.getHtmlLabelName(383091,user.getLanguage())+"!"); } if("2".equals(invoicestatus)){ throw new Exception(SystemEnv.getHtmlLabelName(383092,user.getLanguage())+"!"); } //判断此张发票是否为真 if(isauthenticity){ //为真,判断此张发票是否可以被当前用户使用 if(user.getUID() != userid_new && !InvoiceSharerUtil.isSharerWithoutEidtAll(invoiceId, user)){ throw new Exception(SystemEnv.getHtmlLabelName(517367,user.getLanguage())+"!");//已被其他用户使用 } returnObj.put("flag", "true"); returnObj.put("invoiceId", invoiceId); returnObj.put("invoiceNumber", invoiceNumber); return returnObj; }else{ //不为真需要查验 /** 金额格式化对象;保留两位小数*/ DecimalFormat df = new DecimalFormat("####################################################0.00"); FnaInvoiceCommon fnaInvoiceCommon = new FnaInvoiceCommon(); FnaAbstractInterface fnaAbstractInterface = fnaInvoiceCommon.getInterface(user); String result = ""; if("2".equals(invoiceType)){ result = "01,01,"+invoiceCode+","+invoiceNumber+","+priceWithoutTax+","+billingDate.replace("-", "")+","+fnaInvoiceCommon.addCheckCode(checkcode)+",1111,"; }else{ result = "01,04,"+invoiceCode+","+invoiceNumber+","+priceWithoutTax+","+billingDate.replace("-", "")+","+fnaInvoiceCommon.addCheckCode(checkcode)+",1111,"; } JSONObject resultJson = fnaAbstractInterface.scanQRCodeCheck("0", result,null); int status = resultJson.getInt("status"); if(status!=0){//验票成功 String invoiceNumberTrue = resultJson.getString("_invoiceNumber"); String invoiceCodeTrue = resultJson.getString("_invoicecode"); String billingDateTrue = resultJson.getString("_billingDate"); String priceWithoutTaxTrue = resultJson.getString("_priceWithoutTax"); String taxTrue = resultJson.getString("_tax"); String taxIncludedPriceTrue = resultJson.getString("_taxIncludedPrice"); String purchaserTrue = resultJson.getString("_purchaser");//1 String sellerTrue = resultJson.getString("_seller"); String salesTaxNoTrue = resultJson.getString("_salesTaxNo"); String purchaserTaxNoTrue = resultJson.getString("_purchaserTaxNo");//2 String taxRateTrue =resultJson.getString("_taxRate"); boolean protectInvoiceTaxpayerNumber = FnaInvoiceCommon.protectInvoiceTaxpayerNumber(purchaserTrue,purchaserTaxNoTrue); String updateSql = "update FnaInvoiceLedger set "; if(!protectInvoiceTaxpayerNumber){ /*json.put("flag", false); json.put("msg", SystemEnv.getHtmlLabelName(390260,user.getLanguage())); return json;*/ updateSql += " authenticity = 0,checkStatus = 3 "; }else { updateSql += " authenticity = 1,checkStatus = 1 "; } if(!"".equals(billingDateTrue)){ updateSql += " ,billingDate = '"+StringEscapeUtils.escapeSql(billingDateTrue)+"' "; } if(!"".equals(priceWithoutTaxTrue)){ updateSql += " ,priceWithoutTax = "+df.format(Util.getDoubleValue(priceWithoutTaxTrue,0.00)); } if(!"".equals(taxTrue)){ updateSql += " ,tax = "+df.format(Util.getDoubleValue(taxTrue,0.00)); } if(!"".equals(taxIncludedPriceTrue)){ updateSql += " ,taxIncludedPrice = "+df.format(Util.getDoubleValue(taxIncludedPriceTrue,0.00)); } if(!"".equals(purchaserTrue)){ updateSql += " ,purchaser = '"+StringEscapeUtils.escapeSql(purchaserTrue)+"' "; } if(!"".equals(sellerTrue)){ updateSql += " ,seller = '"+StringEscapeUtils.escapeSql(sellerTrue)+"' "; } if(!"".equals(purchaserTaxNoTrue)){ updateSql += " ,purchaserTaxNo = '"+StringEscapeUtils.escapeSql(purchaserTaxNoTrue)+"' "; } if(!"".equals(salesTaxNoTrue)){ updateSql += " ,salesTaxNo = '"+StringEscapeUtils.escapeSql(salesTaxNoTrue)+"' "; } if(!"".equals(taxRateTrue)){ updateSql += " ,taxRate = "+df.format(Util.getDoubleValue(taxRateTrue,0.00)); } if(!"".equals(invoiceNumberTrue)){ updateSql += " ,invoiceNumber = '"+StringEscapeUtils.escapeSql(invoiceNumberTrue)+"' "; } if(!"".equals(invoiceCodeTrue)){ updateSql += " ,invoiceCode = '"+StringEscapeUtils.escapeSql(invoiceCodeTrue)+"' "; } updateSql += " where id = ? "; //添加日志 //插入日志1 FnaLogSqlUtil fnaLogSqlUtil = new FnaLogSqlUtil(); Map labelIdMap = new HashMap(); Map beforeMap = fnaLogSqlUtil.getInvoiceMap(invoiceId,labelIdMap); rs.executeUpdate(updateSql,Util.getIntValue(invoiceId,0)); if("10100".equals(invoiceType)||"10101".equals(invoiceType) || "10102".equals(invoiceType) || "10103".equals(invoiceType)){//增值税发票 String remark = resultJson.getString("_remark"); String sellerAddress = resultJson.getString("_sellerAddress"); String purchaserAddress = resultJson.getString("_purchaserAddress"); String salesBank = resultJson.getString("_salesBank"); String purchaserBank = resultJson.getString("_purchaserBank"); //保存FnaInvoiceLedgerDtl表信息 InvoiceUtil.updateInsertFnaInvoiceLedgerDtl(1,Util.getIntValue(invoiceId,0),remark,"",sellerAddress,purchaserAddress,salesBank,purchaserBank); saveInvoiceLedgerDetail(resultJson.getJSONArray("detaildata"),invoiceNumberTrue,invoiceCodeTrue,user); } //插入日志2 Map afterMap =fnaLogSqlUtil.getInvoiceMap(invoiceId,labelIdMap); fnaLogSqlUtil.invoiceLedgerAddlog(user,ipAdress,"2",invoiceId,"1", beforeMap,afterMap,labelIdMap); if(!protectInvoiceTaxpayerNumber){ throw new Exception(SystemEnv.getHtmlLabelName(390260,user.getLanguage())); } }else{ String msg = SystemEnv.getHtmlLabelName(509478,user.getLanguage()); if(resultJson.containsKey("errMsg")){ msg = Util.null2String(resultJson.getString("errMsg")); } throw new Exception(msg);//查验失败 } } returnObj.put("flag", "true"); returnObj.put("invoiceId", invoiceId); returnObj.put("invoiceNumber", invoiceNumber); }catch(Exception e){ returnObj.put("flag", "false"); String msString = e.getMessage(); new BaseBean().writeLog("msString:"+msString); if("".equals(msString)){ msString = SystemEnv.getHtmlLabelName(509478,user.getLanguage()); } new BaseBean().writeLog("msString:"+msString); returnObj.put("msg", SystemEnv.getHtmlLabelName(132211,user.getLanguage())+invoiceNumber+msString);//发票 } return returnObj; } /** * * @Title: saveInvoiceLedgerDetail * @Description: 保存发票明细 * @param: @param detailArray * @param: @param invoiceNumber * @param: @param invoiceCode * @param: @throws Exception * @return: void * @throws */ public static void saveInvoiceLedgerDetail( JSONArray detailArray,String invoiceNumber,String invoiceCode,User user) throws Exception { BatchRecordSet brs = new BatchRecordSet(); /** 金额格式化对象;保留两位小数*/ DecimalFormat df = new DecimalFormat("####################################################0.00"); RecordSet rs =new RecordSet(); //查询出发票台账主表的id int mainid =0; rs.executeQuery("select id from fnaInvoiceLedger where invoiceNumber = ? and invoiceCode = ?",invoiceNumber,invoiceCode); if(rs.next()){ mainid = Util.getIntValue(rs.getString("id")); } if(mainid==0){ throw new Exception(SystemEnv.getHtmlLabelName(517370,user.getLanguage())+"!");//发票主表信息不存在 } rs.executeUpdate("delete from FnaInvoiceLedgerDetail where mainid=?",mainid); //writeLog("-----detailArray-----detailArray-----"+detailArray); List insertList = new ArrayList(); for(int i = 0;i idsList = new ArrayList<>(); for(int i=0;i0) { sql = sql.replace("占位符标识", idsBuffer.toString()); if("executeQuery".equals(type)){ rs.executeQuery(sql,idsList); }else if("executeUpdate".equals(type)){ rs.executeUpdate(sql,idsList); } } return rs; } /** * 通过日期获取时间戳 精确到秒 * @param date yyyy-MM-dd * @return */ public static String getTimestamp(String date){ String timestamp = ""; try { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date d = sdf.parse(date); timestamp = Util.null2String(d.getTime()/1000); }catch (Exception e){} return timestamp; } }