Merge branch 'main' of http://172.168.16.71:7070/taikai/taikai2312.git
This commit is contained in:
		
						commit
						bd1d286e2a
					
				|  | @ -0,0 +1,339 @@ | |||
| // | ||||
| // Source code recreated from a .class file by IntelliJ IDEA | ||||
| // (powered by FernFlower decompiler) | ||||
| // | ||||
| 
 | ||||
| package nc.bs.mmpub.setanalysis.bp.multistorey; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.HashMap; | ||||
| import java.util.List; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import nc.bs.dao.BaseDAO; | ||||
| import nc.bs.dao.DAOException; | ||||
| import nc.bs.mmpub.setanalysis.bp.SaMonolayerBP; | ||||
| import nc.bs.mmpub.setanalysis.bp.demand.SaDemandInsertBP; | ||||
| import nc.bs.mmpub.setanalysis.bp.demand.SaDemandQueryBP; | ||||
| import nc.bs.mmpub.setanalysis.bp.log.SaLogInsertBP; | ||||
| import nc.bs.mmpub.setanalysis.bp.utils.SaArrayUtil; | ||||
| import nc.bs.mmpub.setanalysis.bp.utils.SaBooleanUtils; | ||||
| import nc.bs.mmpub.setanalysis.bp.utils.SaLogger; | ||||
| import nc.bs.mmpub.setanalysis.bp.utils.SaVOUtils; | ||||
| import nc.impl.pubapp.pattern.data.vo.VOUpdate; | ||||
| import nc.impl.pubapp.pattern.data.vo.VOUpdateTS; | ||||
| import nc.util.mmf.framework.base.MMNumberUtil; | ||||
| import nc.util.mmf.framework.base.MMValueCheck; | ||||
| import nc.vo.mmpub.setanalysis.entity.AggAnalysisVO; | ||||
| import nc.vo.mmpub.setanalysis.entity.SaAnalysisVO; | ||||
| import nc.vo.mmpub.setanalysis.entity.SaContext; | ||||
| import nc.vo.mmpub.setanalysis.entity.SaDemandVO; | ||||
| import nc.vo.mmpub.setanalysis.entity.SaMatchVO; | ||||
| import nc.vo.mmpub.setanalysis.enumeration.SaDemandType; | ||||
| import nc.vo.mmpub.setanalysis.enumeration.SaMatchType; | ||||
| import nc.vo.mmpub.setanalysis.utils.SaMeasureUtil; | ||||
| import nc.vo.mmpub.setanalysis.utils.SaValidateUtil; | ||||
| import nc.vo.pub.lang.UFDouble; | ||||
| import nc.vo.pubapp.pattern.pub.MapList; | ||||
| import nc.vo.pubapp.pattern.pub.MathTool; | ||||
| import nccloud.baseapp.core.log.NCCForUAPLogger; | ||||
| 
 | ||||
| /** | ||||
|  * 齐套率回写流程生产订单 | ||||
|  * 2005适配2312 | ||||
|  * | ||||
|  * @author mzr | ||||
|  * @date 2025/3/26 | ||||
|  */ | ||||
| public class SaMultiStoreyBP { | ||||
|     private SaContext sc; | ||||
|     private List<SaMatchVO> smVO; | ||||
|     private MapList<String, SaDemandVO> demand; | ||||
|     private Map<String, SaDemandVO> demandPkMap; | ||||
|     private Map<String, AggAnalysisVO> aggPkMap; | ||||
|     private int maxLevel = 0; | ||||
|     private SaAlgorithmBP algorithm; | ||||
| 
 | ||||
|     public SaMultiStoreyBP(SaContext sc) { | ||||
|         SaLogger.debug("3.1.反算齐套初始化开始"); | ||||
|         this.algorithm = new SaAlgorithmBP(); | ||||
|         this.setSc(sc); | ||||
|         List<SaDemandVO> sdList = SaVOUtils.getDemandList(sc.getSdVO()); | ||||
|         this.maxLevel = SaDemandQueryBP.getMaxLevelCode(sdList); | ||||
|         this.setDemand(SaVOUtils.getSortMapList(sdList, "levelcode")); | ||||
|         if (!MMValueCheck.isEmpty(sc.getSdVO())) { | ||||
|             sc.getSdVO().toMap().clear(); | ||||
|         } | ||||
| 
 | ||||
|         this.smVO = new ArrayList(); | ||||
|         this.demandPkMap = new HashMap(); | ||||
|         this.demandPkMap = this.algorithm.demandGroupForPk(sdList); | ||||
|         this.aggPkMap = new HashMap(); | ||||
|         this.aggPkMap = this.algorithm.aggGroupForPk(this.sc.getAggs()); | ||||
|     } | ||||
| 
 | ||||
|     public void doMultiStorey() { | ||||
|         SaLogger.debug("3.2.反算齐套开始计算"); | ||||
|         if (!MMValueCheck.isEmpty(this.demand)) { | ||||
|             for(int curLevel = this.maxLevel; curLevel > 0; --curLevel) { | ||||
|                 List<SaDemandVO> sdList = this.demand.get(Integer.toString(curLevel)); | ||||
|                 if (!MMValueCheck.isEmpty(sdList)) { | ||||
|                     for(SaDemandVO sa : sdList) { | ||||
|                         this.algorithm.setNum(sa); | ||||
|                     } | ||||
| 
 | ||||
|                     this.setDemandForAnalysis(sdList, Integer.toString(curLevel)); | ||||
|                     SaLogger.debug("3.3.反算齐套层码" + Integer.toString(curLevel)); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         this.insert(); | ||||
|     } | ||||
| 
 | ||||
|     private void setDemandForAnalysis(List<SaDemandVO> sdList, String key) { | ||||
|         if (!MMValueCheck.isEmpty(sdList)) { | ||||
|             MapList<String, SaDemandVO> demandMap = SaVOUtils.getSortMapList(sdList, "pk_analysis"); | ||||
|             if (!MMValueCheck.isEmpty(demandMap)) { | ||||
|                 for(Map.Entry<String, List<SaDemandVO>> entry : demandMap.toMap().entrySet()) { | ||||
|                     List<SaDemandVO> demandList = (List)entry.getValue(); | ||||
|                     this.setDemandForFatherid(demandList, key); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private void setDemandForFatherid(List<SaDemandVO> sdList, String key) { | ||||
|         if (!MMValueCheck.isEmpty(sdList)) { | ||||
|             MapList<String, SaDemandVO> demandMap = SaVOUtils.getSortMapList(sdList, "vfatherid"); | ||||
|             if (!MMValueCheck.isEmpty(demandMap)) { | ||||
|                 for(Map.Entry<String, List<SaDemandVO>> entry : demandMap.toMap().entrySet()) { | ||||
|                     List<SaDemandVO> demandList = SaArrayUtil.getMultiDemandSort((List)entry.getValue()); | ||||
|                     SaDemandVO nsetsnum = new SaDemandVO(); | ||||
|                     if (MMValueCheck.isNotEmpty(demandList)) { | ||||
|                         if (SaBooleanUtils.isReplace(demandList)) { | ||||
|                             SaRaplaceItemBP raplaceBP = new SaRaplaceItemBP(demandList); | ||||
|                             List<SaDemandVO> raplaceList = raplaceBP.getRaplaceItem(); | ||||
|                             List<SaDemandVO> materialList = raplaceBP.getMaterialItem(); | ||||
|                             if (!MMValueCheck.isEmpty(raplaceList)) { | ||||
|                                 nsetsnum = this.algorithm.getReplaceNum(raplaceList); | ||||
|                             } | ||||
| 
 | ||||
|                             new SaDemandVO(); | ||||
|                             if (!MMValueCheck.isEmpty(raplaceList)) { | ||||
|                                 SaDemandVO material = this.setMatchFatherid(materialList, key); | ||||
|                                 if (!MMValueCheck.isEmpty(material)) { | ||||
|                                     nsetsnum.setNsetsnum(nsetsnum.getNsetsnum().add(material.getNsetsnum())); | ||||
|                                 } | ||||
|                             } | ||||
|                         } else { | ||||
|                             nsetsnum = this.setMatchFatherid(demandList, key); | ||||
|                         } | ||||
|                     } | ||||
| 
 | ||||
|                     if (MMValueCheck.isNotEmpty(nsetsnum.getNsetsnum()) && nsetsnum.getNsetsnum().compareTo(UFDouble.ZERO_DBL) > 0 || MMValueCheck.isNotEmpty(nsetsnum.getNreplacesetsnum()) && nsetsnum.getNreplacesetsnum().compareTo(UFDouble.ZERO_DBL) > 0) { | ||||
|                         this.setRewriteNmaterialnum(key, nsetsnum, false); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private SaDemandVO setMatchFatherid(List<SaDemandVO> sdList, String key) { | ||||
|         if (MMValueCheck.isEmpty(sdList)) { | ||||
|             return null; | ||||
|         } else { | ||||
|             UFDouble nsetsnumsum = new UFDouble(); | ||||
|             SaDemandVO nsetsnum = new SaDemandVO(); | ||||
|             int num = (int) sdList.stream() | ||||
|                     .filter(saDemandVO -> MathTool.compareTo(saDemandVO.getNmaterialnum(), saDemandVO.getNdemandnum()) >= 0) | ||||
|                     .count(); | ||||
|             MapList<String, SaDemandVO> demandMap = SaVOUtils.getSortMapList(sdList, "vmatchfatherid"); | ||||
|             if (!MMValueCheck.isEmpty(demandMap)) { | ||||
|                 for(Map.Entry<String, List<SaDemandVO>> entry : demandMap.toMap().entrySet()) { | ||||
|                     List<SaDemandVO> demandList = (List)entry.getValue(); | ||||
|                     if (((SaDemandVO)demandList.get(0)).getFmatchtype().equals(SaMatchType.PD.toIntValue()) && ((SaDemandVO)demandList.get(0)).getFdemandtype().equals(SaDemandType.NR.toIntValue())) { | ||||
|                         nsetsnum = this.algorithm.minDemand((SaDemandVO[])demandList.toArray(new SaDemandVO[0])); | ||||
|                         // 设置物料的总行数、满足齐套的物料的行数 | ||||
|                         nsetsnum.setGoodsnum(new UFDouble(sdList.size())); | ||||
|                         nsetsnum.setPass_goodsnum(new UFDouble(num)); | ||||
|                         this.setRewriteNmaterialnum(key, nsetsnum, false); | ||||
|                         this.setRewriteNmaterialnum(key, nsetsnum, true); | ||||
|                         nsetsnumsum = nsetsnumsum.add(nsetsnum.getNsetsnum()); | ||||
|                         break; | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 for(Map.Entry<String, List<SaDemandVO>> entry : demandMap.toMap().entrySet()) { | ||||
|                     List<SaDemandVO> demandList = (List)entry.getValue(); | ||||
|                     if (!((SaDemandVO)demandList.get(0)).getFdemandtype().equals(SaDemandType.NR.toIntValue()) && demandList.size() > 0) { | ||||
|                         nsetsnum = this.algorithm.minDemand((SaDemandVO[])demandList.toArray(new SaDemandVO[0])); | ||||
|                         // 设置物料的总行数、满足齐套的物料的行数 | ||||
|                         nsetsnum.setGoodsnum(new UFDouble(sdList.size())); | ||||
|                         nsetsnum.setPass_goodsnum(new UFDouble(num)); | ||||
|                         this.setRewriteNmaterialnum(key, nsetsnum, true); | ||||
|                         nsetsnumsum = SaValidateUtil.add(nsetsnumsum, nsetsnum.getNsetsnum()); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             if (!MMValueCheck.isEmpty(nsetsnumsum)) { | ||||
|                 nsetsnum.setNsetsnum(nsetsnumsum); | ||||
|             } | ||||
| 
 | ||||
|             return nsetsnum; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private void setRewriteNmaterialnum(String key, SaDemandVO nsetsnum, boolean isUpdateMatch) { | ||||
|         if (!MMValueCheck.isEmpty(nsetsnum)) { | ||||
|             int level = this.getLevel(key); | ||||
|             if (level == 0) { | ||||
|                 if (this.aggPkMap != null) { | ||||
|                     AggAnalysisVO agg = (AggAnalysisVO)this.aggPkMap.get(nsetsnum.getVfatherid()); | ||||
|                     if (agg != null) { | ||||
|                         SaAnalysisVO analysis = agg.getParentVO(); | ||||
|                         analysis.setNsetsnum(MMNumberUtil.add(new UFDouble[]{nsetsnum.getNsetsnum(), nsetsnum.getNreplacesetsnum()})); | ||||
|                         if (isUpdateMatch) { | ||||
|                             // 流程生产订单表体主键 | ||||
|                             String cdemandbillbid = analysis.getCdemandbillbid(); | ||||
|                             // 物料的总行数 | ||||
|                             UFDouble goodsnum = nsetsnum.getGoodsnum().setScale(2, UFDouble.ROUND_HALF_UP); | ||||
|                             // 满足齐套的物料的行数 | ||||
|                             UFDouble pass_goodsnum = nsetsnum.getPass_goodsnum().setScale(2, UFDouble.ROUND_HALF_UP); | ||||
|                             // 齐套率计算=满足的/总数量 | ||||
|                             UFDouble rate = pass_goodsnum.div(goodsnum, 2, UFDouble.ROUND_HALF_UP); | ||||
|                             // 修改流程生产订单的齐套率、物料的总行数、满足齐套的物料的行数 | ||||
|                             String sql = String.format("update mm_mo set vdef12 = '%s',vdef11 = '%s',vdef4 = '%s' where cmoid = '%s'", | ||||
|                                     goodsnum, pass_goodsnum, rate.toString(), cdemandbillbid); | ||||
|                             updateDef4(sql); | ||||
|                         } | ||||
|                     } | ||||
|                 } | ||||
|             } else if (this.demandPkMap != null) { | ||||
|                 new SaDemandVO(); | ||||
|                 SaDemandVO var7 = (SaDemandVO)this.demandPkMap.get(nsetsnum.getVfatherid()); | ||||
|                 if (!isUpdateMatch) { | ||||
|                     UFDouble nmatch = MMNumberUtil.add(new UFDouble[]{var7.getNmatchnum(), nsetsnum.getNsetsnum()}); | ||||
|                     var7.setNmaterialnum(nmatch); | ||||
|                     var7.setNreplacesetsnum(nsetsnum.getNreplacesetsnum()); | ||||
|                 } else { | ||||
|                     this.updateNmaterialnum(nsetsnum, var7); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private int updateDef4(String sql) { | ||||
|         try { | ||||
|             NCCForUAPLogger.debug("sql = " + sql); | ||||
|             BaseDAO baseDAO = new BaseDAO(); | ||||
|             return baseDAO.executeUpdate(sql); | ||||
|         } catch (DAOException e) { | ||||
|             NCCForUAPLogger.debug("setRewriteNmaterialnum-exp:" + e.getMessage()); | ||||
|             throw new RuntimeException(e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private int getLevel(String key) { | ||||
|         return key.length() == 0 ? 0 : Integer.parseInt(key) - 1; | ||||
|     } | ||||
| 
 | ||||
|     private void insert() { | ||||
|         (new SaLogInsertBP(this.sc)).insertLog(); | ||||
|         SaDemandInsertBP sdi = new SaDemandInsertBP(); | ||||
|         List<SaDemandVO> sdList = SaVOUtils.getDemandList(this.demand); | ||||
|         if (!MMValueCheck.isEmpty(sdList)) { | ||||
|             SaLogger.debug("3.4.反算持久化(相关需求,分析对象)" + sdList.size()); | ||||
|             sdi.insertDemand((SaDemandVO[])sdList.toArray(new SaDemandVO[0]), this.sc); | ||||
|             SaAnalysisVO[] sas = SaVOUtils.construcVOs(this.getSc().getAggs()); | ||||
|             SaMeasureUtil.setAnalysisNum(sas); | ||||
|             VOUpdate<SaAnalysisVO> voup = new VOUpdate(); | ||||
|             voup.update(sas, new String[]{"nsetsnum", "nremainnum", "nsetsasnum", "nassremainnum"}); | ||||
|             this.updateMatch(); | ||||
|             SaLogger.debug("3.5.反算持久化结束"); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private void updateNmaterialnum(SaDemandVO saDemand, SaDemandVO hDemand) { | ||||
|         if (!saDemand.getVfatherid().equals(saDemand.getVmatchfatherid()) && (saDemand.getFmatchtype().equals(SaMatchType.PICK.value()) || saDemand.getFmatchtype().equals(SaMatchType.PD.value()) || saDemand.getFmatchtype().equals(SaMatchType.MREQ.value()))) { | ||||
|             SaMatchVO sm = new SaMatchVO(); | ||||
|             sm.setPk_match(saDemand.getVmatchfatherid()); | ||||
|             sm.setNmaterialnum(saDemand.getNsetsnum()); | ||||
|             UFDouble nsetsnum = SaMonolayerBP.getNsetsnum(hDemand, saDemand.getNsetsnum(), (UFDouble)null); | ||||
|             sm.setNsetsnum(nsetsnum); | ||||
|             this.getSmVO().add(sm); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     private void updateMatch() { | ||||
|         SaMatchVO[] sms = (SaMatchVO[])this.getSmVO().toArray(new SaMatchVO[0]); | ||||
|         if (!MMValueCheck.isEmpty(sms)) { | ||||
|             VOUpdateTS<SaMatchVO> voQuery = new VOUpdateTS(); | ||||
|             voQuery.update(sms); | ||||
|             VOUpdate<SaMatchVO> voup = new VOUpdate(); | ||||
|             voup.update(sms, new String[]{"nmaterialnum", "nsetsnum"}); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public int getMaxLevel() { | ||||
|         return this.maxLevel; | ||||
|     } | ||||
| 
 | ||||
|     public void setMaxLevel(int maxLevel) { | ||||
|         this.maxLevel = maxLevel; | ||||
|     } | ||||
| 
 | ||||
|     public MapList<String, SaDemandVO> getDemand() { | ||||
|         return this.demand; | ||||
|     } | ||||
| 
 | ||||
|     public void setDemand(MapList<String, SaDemandVO> demand) { | ||||
|         this.demand = demand; | ||||
|     } | ||||
| 
 | ||||
|     public SaContext getSc() { | ||||
|         return this.sc; | ||||
|     } | ||||
| 
 | ||||
|     public void setSc(SaContext sc) { | ||||
|         this.sc = sc; | ||||
|     } | ||||
| 
 | ||||
|     public List<SaMatchVO> getSmVO() { | ||||
|         return this.smVO; | ||||
|     } | ||||
| 
 | ||||
|     public void setSmVO(List<SaMatchVO> smVO) { | ||||
|         this.smVO = smVO; | ||||
|     } | ||||
| 
 | ||||
|     public SaAlgorithmBP getAlgorithm() { | ||||
|         return this.algorithm; | ||||
|     } | ||||
| 
 | ||||
|     public void setAlgorithm(SaAlgorithmBP algorithm) { | ||||
|         this.algorithm = algorithm; | ||||
|     } | ||||
| 
 | ||||
|     public Map<String, SaDemandVO> getDemandPkMap() { | ||||
|         return this.demandPkMap; | ||||
|     } | ||||
| 
 | ||||
|     public void setDemandPkMap(Map<String, SaDemandVO> demandPkMap) { | ||||
|         this.demandPkMap = demandPkMap; | ||||
|     } | ||||
| 
 | ||||
|     public Map<String, AggAnalysisVO> getAggPkMap() { | ||||
|         return this.aggPkMap; | ||||
|     } | ||||
| 
 | ||||
|     public void setAggPkMap(Map<String, AggAnalysisVO> aggPkMap) { | ||||
|         this.aggPkMap = aggPkMap; | ||||
|     } | ||||
| } | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -0,0 +1,65 @@ | |||
| // | ||||
| // Source code recreated from a .class file by IntelliJ IDEA | ||||
| // (powered by FernFlower decompiler) | ||||
| // | ||||
| 
 | ||||
| package nc.bs.so.m32.maintain; | ||||
| 
 | ||||
| import nc.bs.scmpub.rule.VOSagaFrozenValidateRule; | ||||
| import nc.bs.scmpub.ssc.rule.BaseBillDeleteSyncImage; | ||||
| import nc.bs.scmpub.ssc.rule.SyncRPBillRuleForDelete; | ||||
| import nc.bs.so.m32.maintain.rule.delete.*; | ||||
| import nc.bs.so.m32.plugin.BP32PlugInPoint; | ||||
| import nc.impl.pubapp.pattern.data.bill.BillDelete; | ||||
| import nc.impl.pubapp.pattern.rule.IRule; | ||||
| import nc.impl.pubapp.pattern.rule.processer.AroundProcesser; | ||||
| import nc.vo.ml.NCLangRes4VoTransl; | ||||
| import nc.vo.pubapp.pattern.log.TimeLog; | ||||
| import nc.vo.scmpub.res.billtype.SOBillType; | ||||
| import nc.vo.so.m32.entity.SaleInvoiceVO; | ||||
| 
 | ||||
| public class DeleteSaleInvoiceBP { | ||||
|     public DeleteSaleInvoiceBP() { | ||||
|     } | ||||
| 
 | ||||
|     public void delete(SaleInvoiceVO[] bills) { | ||||
|         AroundProcesser<SaleInvoiceVO> processer = new AroundProcesser(BP32PlugInPoint.DeleteAction); | ||||
|         this.addBeforeRule(processer); | ||||
|         this.addAfterRule(processer); | ||||
|         TimeLog.logStart(); | ||||
|         processer.before(bills); | ||||
|         TimeLog.info(NCLangRes4VoTransl.getNCLangRes().getStrByID("4006008_0", "04006008-0020")); | ||||
|         TimeLog.logStart(); | ||||
|         BillDelete<SaleInvoiceVO> bo = new BillDelete(); | ||||
|         bo.delete(bills); | ||||
|         TimeLog.info(NCLangRes4VoTransl.getNCLangRes().getStrByID("4006008_0", "04006008-0021")); | ||||
|         TimeLog.logStart(); | ||||
|         processer.after(bills); | ||||
|         TimeLog.info(NCLangRes4VoTransl.getNCLangRes().getStrByID("4006008_0", "04006008-0022")); | ||||
|     } | ||||
| 
 | ||||
|     private void addAfterRule(AroundProcesser<SaleInvoiceVO> processer) { | ||||
|         IRule<SaleInvoiceVO> rule = new ReturnBillCodeRule(); | ||||
|         processer.addAfterRule(rule); | ||||
|         IRule<SaleInvoiceVO> updateOppDeleteRule = new UpdateOppDeleteRule(); | ||||
|         processer.addAfterRule(updateOppDeleteRule); | ||||
|         IRule<SaleInvoiceVO> rewriteARSubDeleteRule = new RewriteARSubDeleteRule(); | ||||
|         processer.addAfterRule(rewriteARSubDeleteRule); | ||||
|         IRule<SaleInvoiceVO> rewriteBillDeleteRule = new RewriteBillDeleteRule(); | ||||
|         processer.addAfterRule(rewriteBillDeleteRule); | ||||
|         IRule<SaleInvoiceVO> baseBillDeleteSyncImage = new BaseBillDeleteSyncImage(); | ||||
|         processer.addAfterRule(baseBillDeleteSyncImage); | ||||
|         IRule<SaleInvoiceVO> syncRPBillRuleForDelete = new SyncRPBillRuleForDelete(SOBillType.Invoice.getCode()); | ||||
|         processer.addAfterRule(syncRPBillRuleForDelete); | ||||
|         // 删除后同步修改BIP的开票申请存的NCC信息 | ||||
|         IRule<SaleInvoiceVO> syncBipBillRuleForDelete = new SyncBipBillRuleForDelete(); | ||||
|         processer.addAfterRule(syncBipBillRuleForDelete); | ||||
|     } | ||||
| 
 | ||||
|     private void addBeforeRule(AroundProcesser<SaleInvoiceVO> processer) { | ||||
|         IRule<SaleInvoiceVO> rule = new VOSagaFrozenValidateRule(true); | ||||
|         processer.addBeforeRule(rule); | ||||
|         IRule<SaleInvoiceVO> checkEnableDeleteRule = new CheckEnableDeleteRule(); | ||||
|         processer.addBeforeRule(checkEnableDeleteRule); | ||||
|     } | ||||
| } | ||||
|  | @ -0,0 +1,203 @@ | |||
| package nc.bs.so.m32.maintain.rule.delete; | ||||
| 
 | ||||
| import com.alibaba.fastjson.JSONObject; | ||||
| import com.google.gson.Gson; | ||||
| import com.yonyou.cloud.utils.StringUtils; | ||||
| import nc.bs.logging.Logger; | ||||
| import nc.bs.uapbd.util.IgnoreSslUtil; | ||||
| import nc.impl.pubapp.pattern.rule.IRule; | ||||
| import nc.vo.pubapp.pattern.exception.ExceptionUtils; | ||||
| import nc.vo.so.m32.entity.SaleInvoiceBVO; | ||||
| import nc.vo.so.m32.entity.SaleInvoiceHVO; | ||||
| import nc.vo.so.m32.entity.SaleInvoiceVO; | ||||
| import nccloud.baseapp.core.log.NCCForUAPLogger; | ||||
| 
 | ||||
| import javax.crypto.Mac; | ||||
| import javax.crypto.spec.SecretKeySpec; | ||||
| import javax.net.ssl.HttpsURLConnection; | ||||
| import java.io.*; | ||||
| import java.net.URL; | ||||
| import java.net.URLEncoder; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.security.InvalidKeyException; | ||||
| import java.security.NoSuchAlgorithmException; | ||||
| import java.util.*; | ||||
| 
 | ||||
| /** | ||||
|  * 删除后同步修改BIP的开票申请存的NCC信息 | ||||
|  * 2005适配2312 | ||||
|  * | ||||
|  * @author mzr | ||||
|  * @date 2025/3/20 | ||||
|  */ | ||||
| public class SyncBipBillRuleForDelete implements IRule<SaleInvoiceVO> { | ||||
| 
 | ||||
|     private static String appKey = "a3c57e0d871240e9b9bf56b35001a324"; | ||||
|     private static String appSecret = "a959f7786db8dbb9a2c0493b5855a46bea68ad75"; | ||||
|     private static String tokenUrl = "https://www.tkkfbip.com/iuap-api-auth/open-auth/selfAppAuth/getAccessToken"; | ||||
|     private static String toBipUrl = "https://www.tkkfbip.com/iuap-api-gateway/oxp4h3x6/current_yonbip_default_sys/KKAPI/invoiceApplication/updateInvoice?access_token="; | ||||
| 
 | ||||
|     @Override | ||||
|     public void process(SaleInvoiceVO[] vos) { | ||||
|         try { | ||||
|             boolean hasVdef38 = Arrays.stream(vos) | ||||
|                     .map(SaleInvoiceVO::getParentVO) | ||||
|                     .anyMatch(hvo -> StringUtils.isNotEmpty(hvo.getVdef38())); | ||||
|             // 如果vos里边都没有存BIP合同的开票申请的主键,则不往下执行 | ||||
|             if (!hasVdef38) { | ||||
|                 return; | ||||
|             } | ||||
|             String access_token = getAccessToken(); | ||||
|             for (SaleInvoiceVO invoiceVO : vos) { | ||||
|                 SaleInvoiceHVO hvo = invoiceVO.getParentVO(); | ||||
|                 SaleInvoiceBVO[] bvos = invoiceVO.getChildrenVO(); | ||||
|                 if (access_token.isEmpty()) { | ||||
|                     Logger.error("SyncBipBillRuleForDelete-token获取失败"); | ||||
|                     ExceptionUtils.wrappBusinessException("token获取失败"); | ||||
|                 } | ||||
|                 // bip旗舰版发票主键 | ||||
|                 String vdef38 = hvo.getVdef38(); | ||||
|                 Logger.error("SyncBipBillRuleForDelete-vdef38 = " + vdef38); | ||||
|                 if (StringUtils.isNotEmpty(vdef38)) { | ||||
|                     List<JSONObject> childrenList = new ArrayList<>(); | ||||
|                     for (SaleInvoiceBVO bvo : bvos) { | ||||
|                         JSONObject jsonObject = new JSONObject(); | ||||
|                         if (StringUtils.isNotEmpty(bvo.getVbdef14())) { | ||||
|                             jsonObject.put("id", bvo.getVbdef14()); | ||||
|                             jsonObject.put("saleInvoiceDetailId", ""); | ||||
|                             childrenList.add(jsonObject); | ||||
|                         } | ||||
|                     } | ||||
|                     JSONObject updateJson = new JSONObject(); | ||||
|                     updateJson.put("id", vdef38); | ||||
|                     updateJson.put("saleInvoiceId", ""); | ||||
|                     updateJson.put("contractInvoiceApplicationDetailList", childrenList); | ||||
|                     String bipRes = doPost(toBipUrl + access_token, updateJson); | ||||
|                     NCCForUAPLogger.debug("SyncBipBillRuleForDelete-bipRes = " + bipRes); | ||||
|                 } | ||||
|             } | ||||
|         } catch (NoSuchAlgorithmException | InvalidKeyException | IOException e) { | ||||
|             Logger.error("SyncBipBillRuleForDelete-exp:" + e.getMessage(), e); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 获取旗舰版的token | ||||
|      * | ||||
|      * @return token | ||||
|      * @author mzr | ||||
|      * @date 2025/3/20 | ||||
|      */ | ||||
|     private String getAccessToken() throws NoSuchAlgorithmException, InvalidKeyException, IOException { | ||||
|         // 获取旗舰版的token | ||||
|         Map<String, String> params = new HashMap<>(); | ||||
|         // 除签名外的其他参数 | ||||
|         params.put("appKey", appKey); | ||||
|         String timestamp = String.valueOf(System.currentTimeMillis()); | ||||
|         params.put("timestamp", timestamp); | ||||
|         // 计算签名 | ||||
|         Map<String, String> treeMap = new TreeMap<>(params); | ||||
|         StringBuilder stringBuilder = new StringBuilder(); | ||||
|         for (Map.Entry<String, String> entry : treeMap.entrySet()) { | ||||
|             stringBuilder.append(entry.getKey()).append(entry.getValue()); | ||||
|         } | ||||
|         Mac mac = Mac.getInstance("HmacSHA256"); | ||||
|         mac.init(new SecretKeySpec(appSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); | ||||
|         byte[] signData = mac.doFinal(stringBuilder.toString().getBytes(StandardCharsets.UTF_8)); | ||||
|         String base64String = Base64.getEncoder().encodeToString(signData); | ||||
|         String signature = URLEncoder.encode(base64String, "UTF-8"); | ||||
|         params.put("signature", signature); | ||||
|         String responseString = doGet(tokenUrl, params); | ||||
|         Gson gson = new Gson(); | ||||
|         Map result = gson.fromJson(responseString, Map.class); | ||||
|         String access_token = ""; | ||||
|         if (StringUtils.equals("00000", result.get("code").toString())) { | ||||
|             Map<String, Object> tokenInfo = (Map<String, Object>) result.get("data"); | ||||
|             access_token = (String) tokenInfo.get("access_token"); | ||||
|         } | ||||
|         Logger.error("SyncBipBillRuleForDelete-getAccessToken = " + access_token); | ||||
|         return access_token; | ||||
|     } | ||||
| 
 | ||||
|     private String doGet(String requestUrl, Map<String, String> paramMap) throws IOException { | ||||
| 
 | ||||
|         StringBuilder param = new StringBuilder("?"); | ||||
|         if (paramMap != null) { | ||||
|             for (Map.Entry<String, String> entry : paramMap.entrySet()) { | ||||
|                 param.append(entry.getKey()); | ||||
|                 param.append("="); | ||||
|                 param.append(entry.getValue()); | ||||
|                 param.append("&"); | ||||
|             } | ||||
|             param.deleteCharAt(param.length() - 1); | ||||
|         } | ||||
|         String url = requestUrl + param; | ||||
|         URL u = new URL(url); | ||||
|         try { | ||||
|             if ("https".equalsIgnoreCase(u.getProtocol())) {// 判定网址是否信任,不信任则调用忽略信任工具类SslUtil | ||||
|                 IgnoreSslUtil.ignoreSsl(); | ||||
|             } | ||||
|             HttpsURLConnection connection = (HttpsURLConnection) u.openConnection(); | ||||
|             connection.setRequestMethod("GET"); | ||||
|             connection.setConnectTimeout(5000); | ||||
|             connection.setReadTimeout(5000); | ||||
|             connection.connect(); | ||||
|             StringBuilder response = new StringBuilder(); | ||||
|             int responsecode = connection.getResponseCode(); | ||||
|             if (responsecode == HttpsURLConnection.HTTP_OK) { | ||||
|                 InputStream inputstream = connection.getInputStream(); | ||||
|                 BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream)); | ||||
|                 String line; | ||||
| 
 | ||||
|                 while ((line = reader.readLine()) != null) { | ||||
|                     response.append(line); | ||||
|                 } | ||||
|                 reader.close(); | ||||
|             } | ||||
|             connection.disconnect(); | ||||
|             return response.toString(); | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("SyncBipBillRuleForDelete-doGet:" + e.getMessage(), e); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     private String doPost(String requestUrl, JSONObject json) throws IOException { | ||||
|         URL u = new URL(requestUrl); | ||||
|         try { | ||||
|             if ("https".equalsIgnoreCase(u.getProtocol())) {// 判定网址是否信任,不信任则调用忽略信任工具类SslUtil | ||||
|                 IgnoreSslUtil.ignoreSsl(); | ||||
|             } | ||||
|             HttpsURLConnection connection = (HttpsURLConnection) u.openConnection(); | ||||
|             // 设置请求方法 | ||||
|             connection.setRequestMethod("POST"); | ||||
|             // 设置请求属性 | ||||
|             connection.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); | ||||
|             // 发送POST请求必须设置如下两行 | ||||
|             connection.setDoOutput(true); | ||||
|             connection.setDoInput(true); | ||||
|             byte[] outputInBytes = json.toJSONString().getBytes(StandardCharsets.UTF_8); | ||||
|             // 写入数据到请求体 | ||||
|             OutputStream os = connection.getOutputStream(); | ||||
|             os.write(outputInBytes); | ||||
|             // 获取响应码 | ||||
|             int responseCode = connection.getResponseCode(); | ||||
|             System.out.println("Response Code: " + responseCode); | ||||
|             // 读取响应 | ||||
|             String response = ""; | ||||
|             try (BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()))) { | ||||
|                 br.readLine(); | ||||
|                 // System.out.println("Response: " + response); | ||||
|             } | ||||
|             // 关闭连接 | ||||
|             connection.disconnect(); | ||||
|             return response; | ||||
|         } catch (Exception e) { | ||||
|             Logger.error("SyncBipBillRuleForDelete-doPost:" + e.getMessage(), e); | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
|  | @ -0,0 +1,598 @@ | |||
| package nc.bs.uapbd.bip.workplugin; | ||||
| 
 | ||||
| import com.alibaba.fastjson.JSON; | ||||
| import com.alibaba.fastjson.JSONObject; | ||||
| import com.google.gson.Gson; | ||||
| import com.yonyou.cloud.utils.StringUtils; | ||||
| import nc.bs.dao.BaseDAO; | ||||
| import nc.bs.dao.DAOException; | ||||
| import nc.bs.pub.pa.PreAlertObject; | ||||
| import nc.bs.pub.taskcenter.BgWorkingContext; | ||||
| import nc.bs.pub.taskcenter.IBackgroundWorkPlugin; | ||||
| import nc.bs.trade.business.HYSuperDMO; | ||||
| import nc.jdbc.framework.processor.MapListProcessor; | ||||
| import nc.util.mmf.framework.base.MMValueCheck; | ||||
| import nc.vo.bd.defdoc.DefdocVO; | ||||
| import nc.vo.pub.BusinessException; | ||||
| import org.apache.http.client.config.CookieSpecs; | ||||
| import org.apache.http.client.config.RequestConfig; | ||||
| import org.apache.http.client.methods.HttpPost; | ||||
| import org.apache.http.entity.StringEntity; | ||||
| import org.apache.http.impl.client.CloseableHttpClient; | ||||
| import org.apache.http.impl.client.HttpClients; | ||||
| import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; | ||||
| import org.apache.http.util.EntityUtils; | ||||
| 
 | ||||
| import javax.crypto.Mac; | ||||
| import javax.crypto.spec.SecretKeySpec; | ||||
| import java.io.*; | ||||
| import java.net.HttpURLConnection; | ||||
| import java.net.MalformedURLException; | ||||
| import java.net.URL; | ||||
| import java.net.URLEncoder; | ||||
| import java.nio.charset.Charset; | ||||
| import java.nio.charset.StandardCharsets; | ||||
| import java.security.InvalidKeyException; | ||||
| import java.security.NoSuchAlgorithmException; | ||||
| import java.sql.SQLException; | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.*; | ||||
| import java.util.zip.GZIPInputStream; | ||||
| 
 | ||||
| /** | ||||
|  * 定时任务-回写bip合同销售订单字段 | ||||
|  * 2005适配2312 | ||||
|  * | ||||
|  * @author mzr | ||||
|  * @date 2025/3/26 | ||||
|  */ | ||||
| public class ErpSaleOrderToBIPBackgroupWorkPlugin implements IBackgroundWorkPlugin { | ||||
| 
 | ||||
| 
 | ||||
|     private HYSuperDMO superDMO = null; | ||||
|     private String baseUrl = "https://www.tkkfbip.com"; | ||||
| 
 | ||||
| 
 | ||||
|     public HYSuperDMO getSuperDMO() { | ||||
| 
 | ||||
|         if (superDMO == null) { | ||||
|             superDMO = new HYSuperDMO(); | ||||
|         } | ||||
| 
 | ||||
|         return superDMO; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 检查bip参数是否完整 | ||||
|      * | ||||
|      * @return | ||||
|      */ | ||||
|     private Map<String, String> checkBipParam() { | ||||
| 
 | ||||
|         Map<String, String> map = new HashMap<String, String>(); | ||||
| 
 | ||||
|         String strWhere = " pk_defdoclist in (select pk_defdoclist from bd_defdoclist where code='BIP-sq' and dr=0 )  and dr=0"; | ||||
| 
 | ||||
|         try { | ||||
|             DefdocVO[] defdocVOs = (DefdocVO[]) getSuperDMO().queryByWhereClause(DefdocVO.class, strWhere); | ||||
|             if (defdocVOs != null && defdocVOs.length > 0) { | ||||
|                 for (DefdocVO defdocVO : defdocVOs) { | ||||
| 
 | ||||
|                     map.put(defdocVO.getCode().trim(), defdocVO.getName()); | ||||
| 
 | ||||
|                 } | ||||
|             } | ||||
|         } catch (DAOException e) { | ||||
|             // TODO Auto-generated catch block | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
| 
 | ||||
|         return map; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public PreAlertObject executeTask(BgWorkingContext arg0) throws BusinessException { | ||||
|         // TODO Auto-generated method stub | ||||
| 
 | ||||
|         Date date = new Date(); | ||||
|         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); | ||||
|         String dateTime = dateFormat.format(date); | ||||
| 
 | ||||
|         Map<String, String> bipParamMap = checkBipParam(); | ||||
|         if (bipParamMap.isEmpty()) { | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         baseUrl = bipParamMap.get("baseUrl"); | ||||
|         Map<String, Object> userMap = arg0.getKeyMap(); | ||||
|         String usercustcode = ""; | ||||
| 
 | ||||
|         if (!userMap.isEmpty()) { | ||||
|             if (userMap.get("code") != null) { | ||||
|                 usercustcode = userMap.get("code").toString(); | ||||
|             } | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
|         String invoiceReceiveUrl = bipParamMap.get("contractSaleOrder");// 开票申请单回传 | ||||
|         if (StringUtils.isEmpty(invoiceReceiveUrl)) { | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         Gson gson = new Gson(); | ||||
| 
 | ||||
| 
 | ||||
|         // 获取未推送合同销售订单更新的销售发票信息; | ||||
|         String sql = " select so_saleinvoice_b.cfirstbid,csaleinvoicebid from so_saleinvoice,so_saleinvoice_b where so_saleinvoice.csaleinvoiceid=so_saleinvoice_b.csaleinvoiceid and so_saleinvoice.fstatusflag=2 and nvl(so_saleinvoice_b.vbdef10,'N') in ('~','N') and  nvl(so_saleinvoice.vdef13,'~') not in ('~') "; | ||||
| 
 | ||||
|         List<Map<String, String>> l_pk = (List<Map<String, String>>) new BaseDAO().executeQuery(sql.toString(), new MapListProcessor()); | ||||
|         if (l_pk.isEmpty()) { | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         for (Map<String, String> map : l_pk) { | ||||
| 
 | ||||
| 
 | ||||
|             StringBuffer sb = new StringBuffer(); | ||||
|             sb.append(" select so_saleinvoice_b.csaleinvoicebid,so_saleorder.vdef9,so_saleorder_b.vbdef11,so_saleorder_exe.ntotalarmny as totalaccrued ,so_saleorder_exe.ntotalinvoicenum as billqty, NVL(so_saleorder_exe.ntotaloutnum, 0) as totaloutqty "); | ||||
|             sb.append(" from so_saleorder_exe,so_saleinvoice_b,so_saleinvoice,so_saleorder_b,so_saleorder "); | ||||
|             sb.append(" where so_saleorder_exe.csaleorderbid=so_saleinvoice_b.csrcbid "); | ||||
|             sb.append(" and so_saleinvoice.csaleinvoiceid=so_saleinvoice_b.csaleinvoiceid and so_saleinvoice.fstatusflag=2 "); | ||||
|             sb.append(" and so_saleorder_exe.csaleorderbid=so_saleorder_b.csaleorderbid "); | ||||
|             sb.append(" and so_saleorder.csaleorderid=so_saleorder_b.csaleorderid "); | ||||
|             sb.append(" and so_saleorder_exe.dr=0 and so_saleorder.dr=0 and so_saleorder_b.dr=0 "); | ||||
|             sb.append(" and nvl(so_saleorder.vdef9,'~') not in ('~') "); | ||||
|             sb.append(" and so_saleorder_exe.csaleorderbid='").append(map.get("cfirstbid")).append("'"); | ||||
|             List<Map<String, String>> ll_saleorder = (List<Map<String, String>>) new BaseDAO().executeQuery(sb.toString(), new MapListProcessor()); | ||||
| 
 | ||||
|             if (ll_saleorder.isEmpty()) { | ||||
|                 continue; | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
|             try { | ||||
|                 String accessToken = getAccessToken(baseUrl, bipParamMap); | ||||
|                 Map<String, String> tokenParam = new HashMap<>(); | ||||
|                 tokenParam.put("access_token", accessToken); | ||||
|                 Map<String, String> headers = new HashMap<String, String>(); | ||||
|                 headers.put("Content-Type", "application/json"); | ||||
|                 String custUpdateUrl = baseUrl + invoiceReceiveUrl; | ||||
|                 if (accessToken != "") { | ||||
|                     JSONObject js_apct_detail = new JSONObject(); | ||||
|                     JSONObject js_apct = new JSONObject(); | ||||
|                     String hid = ll_saleorder.get(0).get("vdef9");// BIP合同销售订单更新 主表id | ||||
|                     List<Map<String, Object>> l_map_f = new ArrayList<Map<String, Object>>(); | ||||
|                     for (Map<String, String> custpkmap : ll_saleorder) { | ||||
| 
 | ||||
|                         Map<String, Object> b_map = new HashMap<String, Object>(); | ||||
| 
 | ||||
|                         b_map.put("id", custpkmap.get("vbdef11"));// BIP合同销售订单更新 子表id | ||||
|                         b_map.put("billQty", custpkmap.get("billqty"));// 累计开票主数量 | ||||
|                         b_map.put("totalAccrued", custpkmap.get("totalaccrued"));// 累计确认应收金额 | ||||
|                         b_map.put("totalOutQty", custpkmap.get("totaloutqty"));// 累计出库主数量 | ||||
| 
 | ||||
|                         l_map_f.add(b_map); | ||||
| 
 | ||||
|                         js_apct.put("contractOrdersList", l_map_f); | ||||
|                         js_apct.put("id", hid); | ||||
| 
 | ||||
|                         js_apct_detail.put("HTXSDD", js_apct); | ||||
| 
 | ||||
|                         String resultString = doSendHttp(custUpdateUrl, "POST", tokenParam, "", headers, js_apct_detail.toJSONString()); | ||||
|                         Map updateMap = gson.fromJson(resultString, Map.class); | ||||
|                         String updateSql = ""; | ||||
|                         if (StringUtils.equals("200", updateMap.get("code").toString())) {// 保存更新成功后需要更新日志表 | ||||
|                             updateSql = "update so_saleinvoice_b set vbdef10='Y' where csaleinvoiceid='" + map.get("csaleinvoicebid") + "'"; | ||||
|                         } else { | ||||
|                             updateSql = "update so_saleinvoice_b set vbdef10='N' where csaleinvoiceid='" + map.get("csaleinvoicebid") + "'"; | ||||
|                         } | ||||
|                         getSuperDMO().executeUpdateSQL(updateSql); | ||||
| 
 | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|             } catch (InvalidKeyException e) { | ||||
|                 // TODO Auto-generated catch block | ||||
|                 e.printStackTrace(); | ||||
|             } catch (NoSuchAlgorithmException e) { | ||||
|                 // TODO Auto-generated catch block | ||||
|                 e.printStackTrace(); | ||||
|             } catch (IOException e) { | ||||
|                 // TODO Auto-generated catch block | ||||
|                 e.printStackTrace(); | ||||
|             }// 获取BIP的token | ||||
|             catch (SQLException e) { | ||||
|                 // TODO Auto-generated catch block | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
| 
 | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * 查询bip 中开户行及银行类型id | ||||
|      * | ||||
|      * @param map | ||||
|      * @param bipUrl | ||||
|      * @return | ||||
|      */ | ||||
|     private static Map<String, String> getBIPBankID(HashMap<String, String> map, String bipUrl, String accessToken, String bankdocname) { | ||||
| 
 | ||||
|         Gson gson = new Gson(); | ||||
| 
 | ||||
|         Map<String, String> tokenParam = new HashMap<>(); | ||||
|         tokenParam.put("access_token", accessToken); | ||||
|         String jsonData = JSON.toJSONString(map); | ||||
|         String resultString = doSendHttp(bipUrl, "POST", tokenParam, "", new HashMap<>(), jsonData); | ||||
| //			Map custDetailresult = gson.fromJson(resultString, Map.class); | ||||
|         JSONObject custDetailresult = JSON.parseObject(resultString); | ||||
|         if (StringUtils.equals("200", custDetailresult.get("code").toString())) {// 数据存在 | ||||
|             Map<String, Object> dataInfo = (Map<String, Object>) custDetailresult.get("data"); | ||||
|             if (!MMValueCheck.isEmpty(dataInfo.get("recordList"))) { | ||||
|                 List<Map<String, String>> l_record = (List<Map<String, String>>) dataInfo.get("recordList"); | ||||
|                 return l_record.get(0); | ||||
|             } else { | ||||
|                 map.remove("linenumber"); | ||||
|                 map.put("name", bankdocname); | ||||
|                 jsonData = JSON.toJSONString(map); | ||||
|                 resultString = doSendHttp(bipUrl, "POST", tokenParam, "", new HashMap<>(), jsonData); | ||||
| //					 custDetailresult = gson.fromJson(resultString, Map.class); | ||||
|                 custDetailresult = JSON.parseObject(resultString); | ||||
|                 if (StringUtils.equals("200", custDetailresult.get("code").toString())) {// 数据存在 | ||||
|                     dataInfo = (Map<String, Object>) custDetailresult.get("data"); | ||||
|                     if (!MMValueCheck.isEmpty(dataInfo.get("recordList"))) { | ||||
|                         List<Map<String, String>> l_record = (List<Map<String, String>>) dataInfo.get("recordList"); | ||||
|                         return l_record.get(0); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     public static String doSendHttp(String baseUrl, String method, Map<String, String> paramMap, String mediaType, Map<String, String> headers, String json) { | ||||
|         HttpURLConnection urlConnection = null; | ||||
|         InputStream in = null; | ||||
|         OutputStream out = null; | ||||
|         BufferedReader bufferedReader = null; | ||||
|         String result = null; | ||||
|         try { | ||||
|             StringBuffer sb = new StringBuffer(); | ||||
|             sb.append(baseUrl); | ||||
|             if (paramMap != null) { | ||||
|                 sb.append("?"); | ||||
|                 for (Map.Entry<String, String> entry : paramMap.entrySet()) { | ||||
|                     String key = entry.getKey(); | ||||
|                     String value = entry.getValue(); | ||||
|                     sb.append(key + "=" + value).append("&"); | ||||
|                     baseUrl = sb.toString().substring(0, sb.toString().length() - 1); | ||||
|                 } | ||||
|             } | ||||
| //            log.error("uRL:" + baseUrl); | ||||
| //            // 打印请求URL和方法 | ||||
| //            log.error("Request URL: " + baseUrl); | ||||
| //            log.error("Request Method: " + method); | ||||
|             URL urlobj = new URL(baseUrl); | ||||
|             if ("https".equalsIgnoreCase(urlobj.getProtocol())) {// 判定网址是否信任,不信任则调用忽略信任工具类SslUtil | ||||
|                 IgnoreSslUtil.ignoreSsl(); | ||||
|             } | ||||
|             urlConnection = (HttpURLConnection) urlobj.openConnection(); | ||||
|             urlConnection.setConnectTimeout(50000); | ||||
|             urlConnection.setRequestMethod(method); | ||||
|             urlConnection.setDoInput(true); | ||||
|             urlConnection.setUseCaches(false); | ||||
|             // 如果设置了自定义头,则打印它们 | ||||
|             if (headers != null && !headers.isEmpty()) { | ||||
|                 for (Map.Entry<String, String> entry : headers.entrySet()) { | ||||
|                     urlConnection.addRequestProperty(entry.getKey(), entry.getValue()); | ||||
| //                    log.error("Request Header: " + entry.getKey() + ": " + entry.getValue()); | ||||
|                 } | ||||
|             } | ||||
|             if (json != null && json.length() > 0) { | ||||
| //                log.error("Request Body: " + json); | ||||
|                 urlConnection.setDoInput(true); | ||||
|                 urlConnection.setDoOutput(true); | ||||
|                 out = urlConnection.getOutputStream(); | ||||
|                 out.write(json.getBytes("utf-8")); | ||||
|                 out.flush(); | ||||
|             } | ||||
|             int resCode = urlConnection.getResponseCode(); | ||||
|             String ecod = urlConnection.getContentEncoding(); | ||||
|             if (resCode == HttpURLConnection.HTTP_OK || resCode == HttpURLConnection.HTTP_CREATED | ||||
|                     || resCode == HttpURLConnection.HTTP_ACCEPTED) { | ||||
|                 if (StringUtils.isNotEmpty(ecod) && ecod.equals("gzip")) { | ||||
|                     in = new GZIPInputStream(urlConnection.getInputStream()); | ||||
|                 } else { | ||||
|                     in = urlConnection.getInputStream(); | ||||
|                 } | ||||
|             } else { | ||||
|                 in = urlConnection.getErrorStream(); | ||||
|             } | ||||
|             bufferedReader = new BufferedReader(new InputStreamReader(in, "utf-8")); | ||||
|             StringBuffer temp = new StringBuffer(); | ||||
|             String line = bufferedReader.readLine(); | ||||
|             while (line != null) { | ||||
|                 temp.append(line).append("\r\n"); | ||||
|                 line = bufferedReader.readLine(); | ||||
|             } | ||||
|             if (ecod == null || ecod.equals("gzip")) { | ||||
|                 ecod = Charset.forName("utf-8").name(); | ||||
|             } | ||||
|             result = new String(temp.toString().getBytes("utf-8"), ecod); | ||||
|         } catch (Exception e) { | ||||
|             JSONObject js = new JSONObject(); | ||||
|             js.put("", -1); | ||||
|             js.put("message", "调用外系统接口失败:" + e.getMessage()); | ||||
|             result = js.toString(); | ||||
|             e.printStackTrace(); | ||||
|         } finally { | ||||
|             if (null != bufferedReader) { | ||||
|                 try { | ||||
|                     bufferedReader.close(); | ||||
|                 } catch (IOException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|             } | ||||
|             if (null != out) { | ||||
|                 try { | ||||
|                     out.close(); | ||||
|                 } catch (IOException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|             } | ||||
|             if (null != in) { | ||||
|                 try { | ||||
|                     in.close(); | ||||
|                 } catch (IOException e) { | ||||
|                     e.printStackTrace(); | ||||
|                 } | ||||
|             } | ||||
|             urlConnection.disconnect(); | ||||
|         } | ||||
|         return result; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| //	private String createCustBankMap(Map<String,String> map,String access_token) { | ||||
| //		Gson gson = new Gson(); | ||||
| //		//获取BIP中的客户详情 | ||||
| //		String custcode=map.get("custcode"); | ||||
| //		String custurl=baseUrl+"/yonbip/digitalModel/merchant/detail?access_token="+access_token; | ||||
| //		HashMap<String, String> custMap = new HashMap<String, String>(); | ||||
| //		custMap.put("code", custcode); | ||||
| //		try { | ||||
| //			String custdetailString=doGet(custurl,custMap); | ||||
| // | ||||
| //			Map custDetailresult = gson.fromJson(custdetailString, Map.class); | ||||
| //			if (StringUtils.equals("200", custDetailresult.get("code").toString())) {//客户存在 | ||||
| // | ||||
| //				Map<String, Object> dataInfo = (Map<String, Object>) custDetailresult.get("data"); | ||||
| // | ||||
| //				if (!MMValueCheck.isEmpty(dataInfo.get("merchantAgentFinancialInfos"))){//客户中已经存在银行账户 | ||||
| // | ||||
| //				}else { | ||||
| // | ||||
| //				} | ||||
| // | ||||
| //			} | ||||
| // | ||||
| // | ||||
| //			//开户行 | ||||
| //			String bankdoccode=map.get("bankdoccode"); | ||||
| //			HashMap<String, Object> paramap  = new HashMap<String, Object>(); | ||||
| //			paramap.put("pageIndex", 0); | ||||
| //			paramap.put("pageSize", 10); | ||||
| //			paramap.put("linenumber", bankdoccode); | ||||
| //			String url=baseUrl+"/yonbip/digitalModel/bankdot/list?access_token="+access_token; | ||||
| // | ||||
| //			String responseString=doPost(url,paramap); | ||||
| // | ||||
| //			Map result = gson.fromJson(responseString, Map.class); | ||||
| // | ||||
| //		} catch (IOException e1) { | ||||
| //			// TODO Auto-generated catch block | ||||
| //			e1.printStackTrace(); | ||||
| //		} | ||||
| // | ||||
| //	} | ||||
| 
 | ||||
| 
 | ||||
|     private String getAccessToken(String baseUrl, Map<String, String> bipParamMap) throws NoSuchAlgorithmException, InvalidKeyException, IOException { | ||||
|         String tokenUrl = baseUrl + "/iuap-api-auth/open-auth/selfAppAuth/getAccessToken"; | ||||
| //		String appKey = "f10c4bf17b1d4e1fb08eb82bf8540eab"; | ||||
|         String appKey = bipParamMap.get("appKey"); | ||||
| 
 | ||||
| //		String appSecret = "71dc2a58ca378c1a1143231a62e73e75a60e9236"; | ||||
|         String appSecret = bipParamMap.get("appSecret"); | ||||
|         String accessToken = ""; | ||||
|         Map<String, String> params = new HashMap<>(); | ||||
| 
 | ||||
| 
 | ||||
|         params.put("appKey", appKey); | ||||
|         String timestamp = String.valueOf(System.currentTimeMillis()); | ||||
|         params.put("timestamp", timestamp); | ||||
|         // 计算签名 | ||||
|         Map<String, String> treeMap; | ||||
|         if (params instanceof TreeMap) { | ||||
|             treeMap = params; | ||||
|         } else { | ||||
|             treeMap = new TreeMap<>(params); | ||||
|         } | ||||
|         StringBuilder stringBuilder = new StringBuilder(); | ||||
|         for (Map.Entry<String, String> entry : treeMap.entrySet()) { | ||||
|             stringBuilder.append(entry.getKey()).append(entry.getValue()); | ||||
|         } | ||||
|         Mac mac = Mac.getInstance("HmacSHA256"); | ||||
| 
 | ||||
|         mac.init(new SecretKeySpec(appSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256")); | ||||
|         byte[] signData = mac.doFinal(stringBuilder.toString().getBytes(StandardCharsets.UTF_8)); | ||||
|         String base64String = Base64.getEncoder().encodeToString(signData); | ||||
|         String signature = URLEncoder.encode(base64String, "UTF-8"); | ||||
|         params.put("signature", signature); | ||||
| 
 | ||||
|         String responseString = doGet(tokenUrl, params); | ||||
| 
 | ||||
|         Gson gson = new Gson(); | ||||
|         Map result = gson.fromJson(responseString, Map.class); | ||||
|         if (StringUtils.equals("00000", result.get("code").toString())) { | ||||
|             Map<String, Object> tokenInfo = (Map<String, Object>) result.get("data"); | ||||
|             accessToken = (String) tokenInfo.get("access_token"); | ||||
| 
 | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         return accessToken; | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     private String doPost(String requestUrl, JSONObject jsonObject) throws IOException { | ||||
|         PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); | ||||
|         cm.setMaxTotal(500); | ||||
|         cm.setDefaultMaxPerRoute(50); | ||||
| 
 | ||||
|         RequestConfig globalConfig = RequestConfig.custom().setConnectionRequestTimeout(5000) // 连接池获取连接超时 | ||||
|                 .setConnectTimeout(5000) // 连接建立超时 | ||||
|                 .setSocketTimeout(20000) // 等待响应超时 | ||||
|                 .setCookieSpec(CookieSpecs.IGNORE_COOKIES).build(); | ||||
| 
 | ||||
|         CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm) | ||||
|                 .setDefaultRequestConfig(globalConfig).build(); | ||||
|         HttpPost post = new HttpPost(requestUrl); | ||||
|         post.setHeader("Content-Type", "application/json;charset=UTF-8"); | ||||
|         post.setEntity(new StringEntity(JSONObject.toJSONString(jsonObject), "utf-8")); | ||||
|         String responseString = httpClient.execute(post, response -> EntityUtils.toString(response.getEntity())); | ||||
|         return responseString; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     private String doPost(String requestUrl, Map<String, Object> param) throws IOException { | ||||
|         PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); | ||||
|         cm.setMaxTotal(500); | ||||
|         cm.setDefaultMaxPerRoute(50); | ||||
| 
 | ||||
|         RequestConfig globalConfig = RequestConfig.custom().setConnectionRequestTimeout(5000) // 连接池获取连接超时 | ||||
|                 .setConnectTimeout(5000) // 连接建立超时 | ||||
|                 .setSocketTimeout(20000) // 等待响应超时 | ||||
|                 .setCookieSpec(CookieSpecs.IGNORE_COOKIES).build(); | ||||
| 
 | ||||
|         CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm) | ||||
|                 .setDefaultRequestConfig(globalConfig).build(); | ||||
|         HttpPost post = new HttpPost(requestUrl); | ||||
|         post.setHeader("Content-Type", "application/json;charset=UTF-8"); | ||||
|         post.setEntity(new StringEntity(JSONObject.toJSONString(param), "utf-8")); | ||||
|         String responseString = httpClient.execute(post, response -> EntityUtils.toString(response.getEntity())); | ||||
|         return responseString; | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     private static String doGet(String path, Map<String, String> params) throws IOException { | ||||
|         HttpURLConnection conn = null; | ||||
|         InputStream is = null; | ||||
|         BufferedReader br = null; | ||||
|         StringBuilder result = new StringBuilder(); | ||||
|         try { | ||||
|             if (params != null) { | ||||
|                 String paramStr = ""; | ||||
|                 for (String key : params.keySet()) { | ||||
|                     if (!paramStr.isEmpty()) { | ||||
|                         paramStr += '&'; | ||||
|                     } | ||||
|                     paramStr += key + '=' + params.get(key); | ||||
|                 } | ||||
| 
 | ||||
|                 if (path.indexOf('?') > 0) { | ||||
|                     path += '&' + paramStr; | ||||
|                 } else { | ||||
|                     path += '?' + paramStr; | ||||
|                 } | ||||
|             } | ||||
|             // 创建远程url连接对象 | ||||
|             URL url = new URL(path); | ||||
|             if ("https".equalsIgnoreCase(url.getProtocol())) {// 判定网址是否信任,不信任则调用忽略信任工具类SslUtil | ||||
|                 IgnoreSslUtil.ignoreSsl(); | ||||
|             } | ||||
|             // 通过远程url连接对象打开一个连接,强转成HTTPURLConnection类 | ||||
|             conn = (HttpURLConnection) url.openConnection(); | ||||
|             conn.setRequestMethod("GET"); | ||||
|             // 设置连接超时时间和读取超时时间 | ||||
|             conn.setConnectTimeout(120000); | ||||
|             conn.setReadTimeout(120000); | ||||
|             conn.setRequestProperty("Accept", "application/json"); | ||||
|             // 发送请求 | ||||
|             conn.connect(); | ||||
|             // 通过conn取得输入流,并使用Reader读取 | ||||
|             if (200 == conn.getResponseCode()) { | ||||
|                 is = conn.getInputStream(); | ||||
|                 br = new BufferedReader(new InputStreamReader(is, "UTF-8")); | ||||
|                 String line; | ||||
|                 while ((line = br.readLine()) != null) { | ||||
|                     result.append(line); | ||||
|                     System.out.println(line); | ||||
|                 } | ||||
|             } else { | ||||
|                 System.out.println("ResponseCode is an error code:" + conn.getResponseCode()); | ||||
|             } | ||||
|         } catch (MalformedURLException e) { | ||||
|             e.printStackTrace(); | ||||
|         } catch (IOException e) { | ||||
|             e.printStackTrace(); | ||||
|         } catch (Exception e) { | ||||
|             e.printStackTrace(); | ||||
|         } | ||||
| //        finally { | ||||
| //            try { | ||||
| //                if (br != null) { | ||||
| //                    br.close(); | ||||
| //                } | ||||
| //                if (is != null) { | ||||
| //                    is.close(); | ||||
| //                } | ||||
| //            } catch (IOException ioe) { | ||||
| //                ioe.printStackTrace(); | ||||
| //            } | ||||
| //            conn.disconnect(); | ||||
| //        } | ||||
|         return result.toString(); | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| //    private String doGet(String requestUrl, Map<String, String> paramMap) throws IOException { | ||||
| //		PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); | ||||
| //		cm.setMaxTotal(500); | ||||
| //		cm.setDefaultMaxPerRoute(50); | ||||
| // | ||||
| //		RequestConfig globalConfig = RequestConfig.custom().setConnectionRequestTimeout(5000) // 连接池获取连接超时 | ||||
| //				.setConnectTimeout(5000) // 连接建立超时 | ||||
| //				.setSocketTimeout(20000) // 等待响应超时 | ||||
| //				.setCookieSpec(CookieSpecs.IGNORE_COOKIES).build(); | ||||
| // | ||||
| //		CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm) | ||||
| //				.setDefaultRequestConfig(globalConfig).build(); | ||||
| //		StringBuilder param = new StringBuilder("?"); | ||||
| //		if (paramMap != null) { | ||||
| //			for (Map.Entry<String, String> entry : paramMap.entrySet()) { | ||||
| //				param.append(entry.getKey()); | ||||
| //				param.append("="); | ||||
| //				param.append(entry.getValue()); | ||||
| //				param.append("&"); | ||||
| //			} | ||||
| //			param.deleteCharAt(param.length() - 1); | ||||
| //		} | ||||
| //		String url = requestUrl + param; | ||||
| //		HttpGet get = new HttpGet(url); | ||||
| //		String responseString = httpClient.execute(get, response -> EntityUtils.toString(response.getEntity())); | ||||
| //		get.releaseConnection(); | ||||
| //		return responseString; | ||||
| //	} | ||||
| 
 | ||||
| } | ||||
|  | @ -0,0 +1,60 @@ | |||
| package nc.bs.uapbd.bip.workplugin; | ||||
| import java.security.cert.CertificateException; | ||||
| import java.security.cert.X509Certificate; | ||||
|   | ||||
| import javax.net.ssl.HostnameVerifier; | ||||
| import javax.net.ssl.HttpsURLConnection; | ||||
| import javax.net.ssl.SSLContext; | ||||
| import javax.net.ssl.SSLSession; | ||||
| import javax.net.ssl.TrustManager; | ||||
| import javax.net.ssl.X509TrustManager; | ||||
|   | ||||
| public class IgnoreSslUtil { | ||||
| 	private static void trustAllHttpsCertificates() throws Exception {   | ||||
| 	    TrustManager[] trustAllCerts = new TrustManager[1];   | ||||
| 	    TrustManager tm = new miTM();   | ||||
| 	    trustAllCerts[0] = tm;   | ||||
| 	    SSLContext sc = SSLContext.getInstance("SSL");   | ||||
| 	    sc.init(null, trustAllCerts, null);   | ||||
| 	    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());   | ||||
| 	}   | ||||
| 	   | ||||
| 	static class miTM implements TrustManager,X509TrustManager {   | ||||
| 	    public X509Certificate[] getAcceptedIssuers() {   | ||||
| 	        return null;   | ||||
| 	    }   | ||||
| 	   | ||||
| 	    public boolean isServerTrusted(X509Certificate[] certs) {   | ||||
| 	        return true;   | ||||
| 	    }   | ||||
| 	   | ||||
| 	    public boolean isClientTrusted(X509Certificate[] certs) {   | ||||
| 	        return true;   | ||||
| 	    }   | ||||
| 	   | ||||
| 	    public void checkServerTrusted(X509Certificate[] certs, String authType)   | ||||
| 	            throws CertificateException {   | ||||
| 	        return;   | ||||
| 	    }   | ||||
| 	   | ||||
| 	    public void checkClientTrusted(X509Certificate[] certs, String authType)   | ||||
| 	            throws CertificateException {   | ||||
| 	        return;   | ||||
| 	    }   | ||||
| 	}   | ||||
| 	    | ||||
| 	/**  | ||||
| 	 * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用  | ||||
| 	 * @throws Exception  | ||||
| 	 */   | ||||
| 	public static void ignoreSsl() throws Exception{   | ||||
| 	    HostnameVerifier hv = new HostnameVerifier() {   | ||||
| 	        public boolean verify(String urlHostName, SSLSession session) {   | ||||
| 	            System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());   | ||||
| 	            return true;   | ||||
| 	        }   | ||||
| 	    };   | ||||
| 	    trustAllHttpsCertificates();   | ||||
| 	    HttpsURLConnection.setDefaultHostnameVerifier(hv);   | ||||
| 	}   | ||||
| } | ||||
|  | @ -0,0 +1,60 @@ | |||
| package nc.bs.uapbd.util; | ||||
| import java.security.cert.CertificateException; | ||||
| import java.security.cert.X509Certificate; | ||||
| 
 | ||||
| import javax.net.ssl.HostnameVerifier; | ||||
| import javax.net.ssl.HttpsURLConnection; | ||||
| import javax.net.ssl.SSLContext; | ||||
| import javax.net.ssl.SSLSession; | ||||
| import javax.net.ssl.TrustManager; | ||||
| import javax.net.ssl.X509TrustManager; | ||||
| 
 | ||||
| public class IgnoreSslUtil { | ||||
|     private static void trustAllHttpsCertificates() throws Exception { | ||||
|         TrustManager[] trustAllCerts = new TrustManager[1]; | ||||
|         TrustManager tm = new miTM(); | ||||
|         trustAllCerts[0] = tm; | ||||
|         SSLContext sc = SSLContext.getInstance("SSL"); | ||||
|         sc.init(null, trustAllCerts, null); | ||||
|         HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); | ||||
|     } | ||||
| 
 | ||||
|     static class miTM implements TrustManager,X509TrustManager { | ||||
|         public X509Certificate[] getAcceptedIssuers() { | ||||
|             return null; | ||||
|         } | ||||
| 
 | ||||
|         public boolean isServerTrusted(X509Certificate[] certs) { | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|         public boolean isClientTrusted(X509Certificate[] certs) { | ||||
|             return true; | ||||
|         } | ||||
| 
 | ||||
|         public void checkServerTrusted(X509Certificate[] certs, String authType) | ||||
|                 throws CertificateException { | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         public void checkClientTrusted(X509Certificate[] certs, String authType) | ||||
|                 throws CertificateException { | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 忽略HTTPS请求的SSL证书,必须在openConnection之前调用 | ||||
|      * @throws Exception | ||||
|      */ | ||||
|     public static void ignoreSsl() throws Exception{ | ||||
|         HostnameVerifier hv = new HostnameVerifier() { | ||||
|             public boolean verify(String urlHostName, SSLSession session) { | ||||
|                 System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost()); | ||||
|                 return true; | ||||
|             } | ||||
|         }; | ||||
|         trustAllHttpsCertificates(); | ||||
|         HttpsURLConnection.setDefaultHostnameVerifier(hv); | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue