核销1
This commit is contained in:
		
							parent
							
								
									ff835002e9
								
							
						
					
					
						commit
						f7183c871d
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							|  | @ -0,0 +1,661 @@ | ||||||
|  | /*kOCZ2rdZQh+oO4IyZSOXGg0LHHc/urYgAeiJss7fL0A=*/ | ||||||
|  | package nc.vo.glrp.com.verify; | ||||||
|  | 
 | ||||||
|  | import nc.bs.logging.Logger; | ||||||
|  | import nc.vo.gateway60.itfs.Currency; | ||||||
|  | import nc.vo.gateway60.pub.GlBusinessException; | ||||||
|  | import nc.vo.glcom.shellsort.CShellSort; | ||||||
|  | import nc.vo.glcom.sorttool.CVoSortTool; | ||||||
|  | import nc.vo.glrp.pub.VerifyMsg; | ||||||
|  | import nc.vo.glrp.pub.VoComparer; | ||||||
|  | import nc.vo.glrp.verify.VerifyDetailKey; | ||||||
|  | import nc.vo.glrp.verify.VerifyDetailVO; | ||||||
|  | import nc.vo.pub.BusinessException; | ||||||
|  | import nc.vo.pub.lang.UFDate; | ||||||
|  | import nc.vo.pub.lang.UFDouble; | ||||||
|  | 
 | ||||||
|  | import java.lang.reflect.Array; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.Hashtable; | ||||||
|  | import java.util.List; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * @author mzr | ||||||
|  |  * @ClassName: MultiMatch | ||||||
|  |  * @Description: 异币种借贷核销实现类 | ||||||
|  |  * @date 2013-6-18 下午01:49:19 | ||||||
|  |  */ | ||||||
|  | public class MultiMatch implements IMatchTool { | ||||||
|  | 
 | ||||||
|  |     public IVerifyVO[] m_debitvos; | ||||||
|  |     public IVerifyVO[] m_creditvos; | ||||||
|  |     private VerifyRuleVO m_rulevo; | ||||||
|  |     private List<ILogVO> m_alLogs; | ||||||
|  |     private Hashtable<String, List<IVerifyVO>> m_hash; | ||||||
|  |     private VoComparer m_comparer; | ||||||
|  |     private String pk_accountingbook; | ||||||
|  |     private String pk_user; | ||||||
|  |     private String pk_group; | ||||||
|  |     private UFDate oprDate; | ||||||
|  | 
 | ||||||
|  |     public String getPk_user() { | ||||||
|  |         return this.pk_user; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setPk_user(String pk_user) { | ||||||
|  |         this.pk_user = pk_user; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getPk_group() { | ||||||
|  |         return this.pk_group; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setPk_group(String pk_group) { | ||||||
|  |         this.pk_group = pk_group; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public UFDate getOprDate() { | ||||||
|  |         return this.oprDate; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setOprDate(UFDate oprDate) { | ||||||
|  |         this.oprDate = oprDate; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setDebitData(IVerifyVO[] debtDataVos) { | ||||||
|  |         this.m_debitvos = debtDataVos; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public IVerifyVO[] getDebitData() { | ||||||
|  |         return this.m_debitvos; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setCreditData(IVerifyVO[] creditDataVo) { | ||||||
|  |         this.m_creditvos = creditDataVo; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public IVerifyVO[] getCreditData() { | ||||||
|  |         return this.m_creditvos; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setRule(VerifyRuleVO rulevo) { | ||||||
|  |         this.m_rulevo = rulevo; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public VerifyRuleVO getRule() { | ||||||
|  |         return this.m_rulevo; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private Hashtable<String, List<IVerifyVO>> getHash() { | ||||||
|  |         if (this.m_hash == null) { | ||||||
|  |             this.m_hash = new Hashtable(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return this.m_hash; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private VoComparer getComparer() { | ||||||
|  |         if (this.m_comparer == null) { | ||||||
|  |             this.m_comparer = new VoComparer(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return this.m_comparer; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * <p>Title: </p> | ||||||
|  |      * <p>Description: </p> | ||||||
|  |      */ | ||||||
|  |     public MultiMatch() { | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* (非 Javadoc) | ||||||
|  |      * <p>Title: getLogData</p> | ||||||
|  |      * <p>Description: </p> | ||||||
|  |      * @return | ||||||
|  |      * @see nc.vo.glrp.com.verify.IMatchTool#getLogData() | ||||||
|  |      */ | ||||||
|  |     public ILogVO[] getLogData() { | ||||||
|  |         if (this.m_alLogs != null && !this.m_alLogs.isEmpty()) { | ||||||
|  |             try { | ||||||
|  |                 ILogVO[] logs = (ILogVO[]) Array.newInstance(this.m_alLogs.get(0).getClass(), this.m_alLogs.size()); | ||||||
|  |                 logs = (ILogVO[]) this.m_alLogs.toArray(logs); | ||||||
|  |                 return logs; | ||||||
|  |             } catch (Exception ex) { | ||||||
|  |                 Logger.error(ex.getMessage(), ex); | ||||||
|  |                 return null; | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             return null; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* (非 Javadoc) | ||||||
|  |      * <p>Title: getToolName</p> | ||||||
|  |      * <p>Description: </p> | ||||||
|  |      * @return | ||||||
|  |      * @see nc.vo.glrp.com.verify.IMatchTool#getToolName() | ||||||
|  |      */ | ||||||
|  |     public String getToolName() { | ||||||
|  |         return "GLMultiMatch"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* (非 Javadoc) | ||||||
|  |      * <p>Title: onMatch</p> | ||||||
|  |      * <p>Description: 异币种核销匹配算法 </p> | ||||||
|  |      * @see nc.vo.glrp.com.verify.IMatchTool#onMatch() | ||||||
|  |      */ | ||||||
|  |     public void onMatch() throws Exception { | ||||||
|  |         try { | ||||||
|  |             // 检查借贷方数据为空 | ||||||
|  |             checkData(); | ||||||
|  |             removeOldData(); | ||||||
|  |             perpareData(); | ||||||
|  | 
 | ||||||
|  |             boolean bDebitLoop = true; | ||||||
|  |             String shashKey; | ||||||
|  |             bDebitLoop = (getDebitData().length < getCreditData().length); | ||||||
|  |             IVerifyVO[] voloop = bDebitLoop ? getDebitData() : getCreditData(); | ||||||
|  |             String[] sObjkeys = bDebitLoop ? getRule().getDebtObjKeys() : getRule().getCreditObjKeys(); | ||||||
|  |             UFDouble[] dealMny = new UFDouble[2];// 记录较少的一方的未核销金额 | ||||||
|  |             UFDouble[] oppMny = new UFDouble[2];// 记录较多的一方的未核销金额 | ||||||
|  |             UFDouble[] verifyMny = new UFDouble[2];// 本次核销金额 | ||||||
|  | 
 | ||||||
|  |             if (getRule().getDateName() != null && getRule().getMaxDateError() != null) { | ||||||
|  |                 getComparer().setCompareKey(new String[]{getRule().getDateName()}); | ||||||
|  |                 getComparer().setDaterange(getRule().getMaxDateError().intValue()); | ||||||
|  |             } | ||||||
|  |             List<IVerifyVO> alOpp = null; | ||||||
|  |             IVerifyVO voOpp = null; | ||||||
|  |             for (int i = 0; i < voloop.length; i++) { | ||||||
|  |                 if (bDebitLoop) { | ||||||
|  |                     dealMny[0] = voloop[i].getDebit_Money_Y(); | ||||||
|  |                     dealMny[1] = voloop[i].getDebit_Money_B(); | ||||||
|  |                 } else { | ||||||
|  |                     dealMny[0] = voloop[i].getCredit_Money_Y(); | ||||||
|  |                     dealMny[1] = voloop[i].getCredit_Money_B(); | ||||||
|  |                 } | ||||||
|  |                 if (isSettled(dealMny)) { | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  |                 shashKey = gethashKey(voloop[i], sObjkeys); | ||||||
|  |                 try { | ||||||
|  |                     alOpp = getHash().get(shashKey); | ||||||
|  |                     if (alOpp == null || alOpp.size() == 0) { | ||||||
|  |                         continue; | ||||||
|  |                     } | ||||||
|  |                 } catch (Exception ex) { | ||||||
|  |                     continue; | ||||||
|  |                 } | ||||||
|  |                 for (int j = 0; j < alOpp.size(); ) { | ||||||
|  |                     if (isSettled(dealMny)) {// 如果记录较少的一方未核销金额为0,则表示改记录已核销完,继续下一条记录 | ||||||
|  |                         break; | ||||||
|  |                     } | ||||||
|  |                     voOpp = (IVerifyVO) alOpp.get(j); | ||||||
|  |                     if (bDebitLoop) { | ||||||
|  |                         oppMny[0] = voOpp.getCredit_Money_Y(); | ||||||
|  |                         oppMny[1] = voOpp.getCredit_Money_B(); | ||||||
|  |                     } else { | ||||||
|  |                         oppMny[0] = voOpp.getDebit_Money_Y(); | ||||||
|  |                         oppMny[1] = voOpp.getDebit_Money_B(); | ||||||
|  |                     } | ||||||
|  |                     if (isSettled(oppMny)) { | ||||||
|  |                         alOpp.remove(j); | ||||||
|  |                         continue; | ||||||
|  |                     } | ||||||
|  |                     if (!existInDateRange(voloop[i], voOpp)) { | ||||||
|  |                         j++; | ||||||
|  |                         continue; | ||||||
|  |                     } | ||||||
|  |                     //--add by pangjsh 判断数据方向是否同向 | ||||||
|  |                     if (!isVerifyEnable(voloop[i], voOpp, bDebitLoop)) { | ||||||
|  |                         j++; | ||||||
|  |                         continue; | ||||||
|  |                     } | ||||||
|  |                     /*判断核销金额*/ | ||||||
|  |                     /*如果是红对兰则按照兰字金额核销*/ | ||||||
|  |                     for (int m = 0; m < verifyMny.length; m++) { | ||||||
|  |                         if (dealMny[m] != null && oppMny[m] != null) {// 取借贷方未核销金额少的作为本次核销金额 | ||||||
|  |                             verifyMny[m] = dealMny[m].abs().compareTo(oppMny[m].abs()) > 0 ? oppMny[m] : dealMny[m]; | ||||||
|  |                         } else { | ||||||
|  |                             verifyMny[m] = ZERO; | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     if (isSettled(verifyMny)) { | ||||||
|  |                         j++; | ||||||
|  |                         continue; | ||||||
|  |                     } | ||||||
|  |                     /*形成log,回写余额*/ | ||||||
|  |                     // 计算本次核销后,记录较多的一方的未核销金额 | ||||||
|  |                     if (bDebitLoop) { | ||||||
|  |                         m_alLogs.addAll(generateLogs(verifyMny, voloop[i], voOpp)); | ||||||
|  |                         if (voOpp.getCredit_Money_Y() != null && !verifyMny[0].equals(ZERO)) { | ||||||
|  |                             voOpp.setCredit_Money_Y( | ||||||
|  |                                     voOpp.getCredit_Money_Y().sub(verifyMny[0], verifyMny[0].getPower())); | ||||||
|  |                         } | ||||||
|  |                         if (voOpp.getCredit_Money_B() != null && !verifyMny[1].equals(ZERO)) { | ||||||
|  |                             voOpp.setCredit_Money_B( | ||||||
|  |                                     voOpp.getCredit_Money_B().sub(verifyMny[1], verifyMny[1].getPower())); | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                     } else { | ||||||
|  |                         m_alLogs.addAll(generateLogs(verifyMny, voOpp, voloop[i])); | ||||||
|  |                         if (voOpp.getDebit_Money_Y() != null && !verifyMny[0].equals(ZERO)) { | ||||||
|  |                             voOpp.setDebit_Money_Y( | ||||||
|  |                                     voOpp.getDebit_Money_Y().sub(verifyMny[0], verifyMny[0].getPower())); | ||||||
|  |                         } | ||||||
|  |                         if (voOpp.getDebit_Money_B() != null && !verifyMny[1].equals(ZERO)) { | ||||||
|  |                             voOpp.setDebit_Money_B( | ||||||
|  |                                     voOpp.getDebit_Money_B().sub(verifyMny[1], verifyMny[1].getPower())); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     // 计算本次核销后,记录较少的一方的未核销金额 | ||||||
|  |                     for (int n = 0; n < dealMny.length; n++) { | ||||||
|  |                         if (dealMny[n] != null && !verifyMny[n].equals(ZERO)) { | ||||||
|  |                             dealMny[n] = dealMny[n].sub(verifyMny[n], verifyMny[n].getPower()); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     if (bDebitLoop) { | ||||||
|  |                         if (isSettled(new UFDouble[]{voOpp.getCredit_Money_Y(), | ||||||
|  |                                 voOpp.getCredit_Money_B()})) { | ||||||
|  |                             alOpp.remove(j); | ||||||
|  |                         } | ||||||
|  |                     } else { | ||||||
|  |                         if (isSettled(new UFDouble[]{voOpp.getDebit_Money_Y(), | ||||||
|  |                                 voOpp.getDebit_Money_B()})) { | ||||||
|  |                             alOpp.remove(j); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |                 /*回写余额*/ | ||||||
|  |                 if (bDebitLoop) { | ||||||
|  |                     voloop[i].setDebit_Money_Y(dealMny[0]); | ||||||
|  |                     voloop[i].setDebit_Money_B(dealMny[1]); | ||||||
|  |                 } else { | ||||||
|  |                     voloop[i].setCredit_Money_Y(dealMny[0]); | ||||||
|  |                     voloop[i].setCredit_Money_B(dealMny[1]); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             Logger.error(e.getMessage(), e); | ||||||
|  |             throw new GlBusinessException(e.getMessage()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param @throws BusinessException | ||||||
|  |      * @return void | ||||||
|  |      * @throws | ||||||
|  |      * @Title: checkData | ||||||
|  |      * @Description: 检查借贷方数据为空 | ||||||
|  |      */ | ||||||
|  |     private void checkData() throws BusinessException { | ||||||
|  |         if (getDebitData() == null || getDebitData().length == 0 || getCreditData() == null || getCreditData().length == 0) { | ||||||
|  |             throw new BusinessException(VerifyMsg.getMSG_NOVERIFYDATA()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param | ||||||
|  |      * @return void | ||||||
|  |      * @throws | ||||||
|  |      * @Title: removeOldData | ||||||
|  |      * @Description: 清除旧数据 | ||||||
|  |      */ | ||||||
|  |     private void removeOldData() { | ||||||
|  |         m_alLogs = new ArrayList<ILogVO>(); | ||||||
|  |         getHash().clear(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param @throws Exception | ||||||
|  |      * @return void | ||||||
|  |      * @throws | ||||||
|  |      * @Title: perpareData | ||||||
|  |      * @Description: TODO(准备新数据) | ||||||
|  |      */ | ||||||
|  |     private void perpareData() throws BusinessException { | ||||||
|  |         try { | ||||||
|  |             // 借贷方有数据不存在就返回 | ||||||
|  |             if (getDebitData() == null || getDebitData().length == 0 || getCreditData() == null || getCreditData().length == 0) { | ||||||
|  |                 return; | ||||||
|  |             } | ||||||
|  |             // 按币种格式化借方金额 | ||||||
|  |             for (int i = 0; i < getDebitData().length; i++) { | ||||||
|  |                 // todo 1 | ||||||
|  |                 String currPk = getDebitData()[i].getCurrPk(); | ||||||
|  |                 getDebitData()[i].setDebit_Money_Y(Currency.formatByCurrType(currPk, getDebitData()[i].getDebit_Money_Y())); | ||||||
|  |                 getDebitData()[i].setDebit_Money_B(Currency.formatByCurrType(Currency.getLocalCurrPK(getPk_accountingbook()), getDebitData()[i].getDebit_Money_B())); | ||||||
|  |             } | ||||||
|  |             // 按币种格式化贷方金额 | ||||||
|  |             for (int i = 0; i < getCreditData().length; i++) { | ||||||
|  |                 // todo 1 | ||||||
|  |                 String currPk = getCreditData()[i].getCurrPk(); | ||||||
|  |                 getCreditData()[i].setCredit_Money_Y(Currency.formatByCurrType(currPk, getCreditData()[i].getCredit_Money_Y())); | ||||||
|  |                 getCreditData()[i].setCredit_Money_B(Currency.formatByCurrType(Currency.getLocalCurrPK(getPk_accountingbook()), getCreditData()[i].getCredit_Money_B())); | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  |             // 按规则排序借方数据 | ||||||
|  |             sortData(true, getRule().getDebtSortKeys()); | ||||||
|  |             // 按规则排序贷方数据 | ||||||
|  |             sortData(false, getRule().getCreditSortKeys()); | ||||||
|  | 
 | ||||||
|  |             if (getCreditData().length > getDebitData().length) { | ||||||
|  |                 fill2Hash(getCreditData(), false); | ||||||
|  |             } else { | ||||||
|  |                 fill2Hash(getDebitData(), true); | ||||||
|  |             } | ||||||
|  |         } catch (Exception e) { | ||||||
|  |             Logger.error(e.getMessage(), e); | ||||||
|  |             throw new GlBusinessException(e.getMessage()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param isDebit | ||||||
|  |      * @param sortKeys | ||||||
|  |      * @throws Exception | ||||||
|  |      * @Title: sortData | ||||||
|  |      * @Description: TODO(按照设置的排序字段排序) | ||||||
|  |      */ | ||||||
|  |     private void sortData(boolean isDebit, String[] sortKeys) throws Exception { | ||||||
|  |         if (sortKeys != null && sortKeys.length > 0) { | ||||||
|  |             int[] iIndex = sortKeys[0].equals("prepareddate") ? | ||||||
|  |                     new int[]{VerifyDetailKey.VOUCHDATE, VerifyDetailKey.VOUCHERTYPENAME, | ||||||
|  |                             VerifyDetailKey.DISP_VOUCHERNO, VerifyDetailKey.DETAILINDEX} : | ||||||
|  |                     new int[]{VerifyDetailKey.BUSINESSDATE, VerifyDetailKey.VOUCHERTYPENAME, | ||||||
|  |                             VerifyDetailKey.DISP_VOUCHERNO, VerifyDetailKey.DETAILINDEX}; | ||||||
|  |             CShellSort objShellSort = new CShellSort(); | ||||||
|  |             CVoSortTool objVoSortTool = new CVoSortTool(); | ||||||
|  |             objVoSortTool.setSortIndex(iIndex); | ||||||
|  |             objShellSort.sort(isDebit ? getDebitData() : getCreditData(), objVoSortTool, !getRule().getVerifySeq().booleanValue()); | ||||||
|  |         } else { | ||||||
|  |             getComparer().setDaterange(0); | ||||||
|  |             getComparer().setAscend(getRule().getVerifySeq().booleanValue()); | ||||||
|  |             getComparer().setCompareKey(new String[]{getRule().getDateName()}); | ||||||
|  |             Arrays.sort(getDebitData(), getComparer()); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param @param vos | ||||||
|  |      * @param @param bDebit | ||||||
|  |      * @return void | ||||||
|  |      * @throws | ||||||
|  |      * @Title: fill2Hash | ||||||
|  |      * @Description: TODO(将数据添加到hash表中) | ||||||
|  |      */ | ||||||
|  |     private void fill2Hash(IVerifyVO[] vos, boolean bDebit) { | ||||||
|  |         // 得到核销部分标准(按核销号、金额相等、末级科目、按对账标识码、按辅助项中的全部或部分) | ||||||
|  |         String[] sKeys = (bDebit ? getRule().getDebtObjKeys() : getRule().getCreditObjKeys()); | ||||||
|  |         String sCurrKey = null; | ||||||
|  |         List<IVerifyVO> oCurrValues = null; | ||||||
|  |         for (int i = 0; i < vos.length; i++) { | ||||||
|  |             sCurrKey = gethashKey(vos[i], sKeys); | ||||||
|  |             oCurrValues = getHash().get(sCurrKey); | ||||||
|  |             if (oCurrValues == null) { | ||||||
|  |                 oCurrValues = new ArrayList<IVerifyVO>(); | ||||||
|  |             } | ||||||
|  |             if (isEqual(vos[i], sKeys)) { | ||||||
|  |                 oCurrValues.add(vos[i]); | ||||||
|  |                 getHash().put(sCurrKey, oCurrValues); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param @param  verifyvo | ||||||
|  |      * @param @param  skeys | ||||||
|  |      * @param @return | ||||||
|  |      * @return String | ||||||
|  |      * @throws | ||||||
|  |      * @Title: gethashKey | ||||||
|  |      * @Description: TODO(得到hash键值) | ||||||
|  |      */ | ||||||
|  |     private String gethashKey(IVerifyVO verifyvo, String[] skeys) { | ||||||
|  |         StringBuffer shashKey = new StringBuffer(); | ||||||
|  |         if (skeys == null || skeys.length <= 0) { | ||||||
|  |             return "null"; | ||||||
|  |         } | ||||||
|  |         Object ob = null; | ||||||
|  |         for (int i = 0; i < skeys.length; i++) { | ||||||
|  |             if (skeys[i].equals("Mny")) { | ||||||
|  |                 // modified by shipl 2015-11-12 15:26:58 :原币相等即可核销! | ||||||
|  |                 if (verifyvo.getDirect().equals(IVerifyVO.I_DEBIT)) { /*借方*/ | ||||||
|  |                     ob = verifyvo.getDebit_Money_Y(); | ||||||
|  |                     shashKey.append("_").append(ob == null ? "null" : ob.toString()); | ||||||
|  | //					ob = verifyvo.getDebit_Money_B(); | ||||||
|  | //					shashKey.append("_").append(ob == null ? "null" : ob.toString()); | ||||||
|  |                 } else { /*贷方*/ | ||||||
|  |                     ob = verifyvo.getCredit_Money_Y(); | ||||||
|  |                     shashKey.append("_").append(ob == null ? "null" : ob.toString()); | ||||||
|  | //					ob = verifyvo.getCredit_Money_B(); | ||||||
|  | //					shashKey.append("_").append(ob == null ? "null" : ob.toString()); | ||||||
|  |                 } | ||||||
|  |             } else { | ||||||
|  |                 ob = verifyvo.getAttributeValue(skeys[i]); | ||||||
|  |                 shashKey.append("_").append(ob == null ? "null" : ob.toString()); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return shashKey.toString(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param @param  vo 当前待核销的数据 | ||||||
|  |      * @param @param  sKeys 核销部分标准(按核销号、金额相等、末级科目、按对账标识码、按辅助项中的全部或部分) | ||||||
|  |      * @param @return | ||||||
|  |      * @return boolean | ||||||
|  |      * @throws | ||||||
|  |      * @Title: isEqual | ||||||
|  |      * @Description: TODO(判断数据的辅助核算与自动核销按辅助项中辅助核算是否一致) | ||||||
|  |      */ | ||||||
|  |     private boolean isEqual(IVerifyVO vo, String[] sKeys) { | ||||||
|  |         boolean result = true; | ||||||
|  |         VerifyDetailVO vo1 = (VerifyDetailVO) vo; | ||||||
|  |         if (null != sKeys && sKeys.length > 0) { | ||||||
|  |             for (int i = 0; i < sKeys.length; i++) { | ||||||
|  |                 if (null != sKeys[i] && sKeys[i].startsWith("fzhs_")) { | ||||||
|  |                     String asstype = sKeys[i].substring(5, 25); | ||||||
|  |                     String assvalue = sKeys[i].substring(25); | ||||||
|  |                     for (int j = 0; vo1.getAss() != null && j < vo1.getAss().length; j++) { | ||||||
|  |                         if (vo1.getAss()[j] != null) { | ||||||
|  |                             if (vo1.getAss()[j].getPk_Checktype().equals(asstype)) { | ||||||
|  |                                 if (!"null".equals(assvalue) && !isExists(vo1.getAss()[j].getPk_Checkvalue(), assvalue)) { | ||||||
|  |                                     result = false; | ||||||
|  |                                     break; | ||||||
|  |                                 } | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return result; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param @param  pk_checkvalue 比如pk_checkvalue="100288100000000000K2" | ||||||
|  |      * @param @param  assvalue 比如assvalue="100288100000000000K1,100288100000000000K2" | ||||||
|  |      * @param @return | ||||||
|  |      * @return boolean | ||||||
|  |      * @throws | ||||||
|  |      * @Title: isExists | ||||||
|  |      * @Description: TODO(判断pk_checkvalue是否存在于assvalue中) | ||||||
|  |      */ | ||||||
|  |     private boolean isExists(String pk_checkvalue, String assvalue) { | ||||||
|  |         String[] tmpArr = assvalue.split(","); | ||||||
|  |         if (null != tmpArr && tmpArr.length > 0) { | ||||||
|  |             for (int i = 0; i < tmpArr.length; i++) { | ||||||
|  |                 if (null != tmpArr[i] && tmpArr[i].equals(pk_checkvalue)) { | ||||||
|  |                     return true; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param @param  vo1 | ||||||
|  |      * @param @param  vo2 | ||||||
|  |      * @param @return | ||||||
|  |      * @return boolean | ||||||
|  |      * @throws | ||||||
|  |      * @Title: existInDateRange | ||||||
|  |      * @Description: TODO(判断两vo是否在核销规则的日期误差天数内) | ||||||
|  |      */ | ||||||
|  |     private boolean existInDateRange(IVerifyVO vo1, IVerifyVO vo2) { | ||||||
|  |         if (getRule().getMaxDateError() != null) { | ||||||
|  |             getComparer().setDaterange(getRule().getMaxDateError().intValue()); | ||||||
|  |             getComparer().setCompareKey(new String[]{getRule().getDateName()}); | ||||||
|  |             return getComparer().compare(vo1, vo2) == 0 ? true : false; | ||||||
|  |         } | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 功能:判断两vo是否数据同向 | ||||||
|  |      * 作者:逄居升 | ||||||
|  |      * 创建时间:(2014-6-19 13:05:15) | ||||||
|  |      * 参数:<|> | ||||||
|  |      * 返回值: | ||||||
|  |      * 算法: | ||||||
|  |      * | ||||||
|  |      * @param vo1 nc.vo.glrp.com.verify.IVerifyVO | ||||||
|  |      * @param vo2 nc.vo.glrp.com.verify.IVerifyVO | ||||||
|  |      * @return boolean | ||||||
|  |      */ | ||||||
|  |     private boolean isVerifyEnable(IVerifyVO vo1, IVerifyVO vo2, boolean bDebitLoop) { | ||||||
|  | 
 | ||||||
|  |         if (bDebitLoop) { | ||||||
|  |             UFDouble[] debit = new UFDouble[]{vo1.getDebit_Money_Y(), vo1.getDebit_Money_B()}; | ||||||
|  |             UFDouble[] credit = new UFDouble[]{vo2.getCredit_Money_Y(), vo2.getCredit_Money_B()}; | ||||||
|  |             for (int i = 0; i < debit.length; i++) { | ||||||
|  |                 if ((debit[i].doubleValue() > 0 && credit[i].doubleValue() > 0) | ||||||
|  |                         || (debit[i].doubleValue() < 0 && credit[i].doubleValue() < 0) | ||||||
|  |                         || (debit[i].equals(ZERO) && credit[i].equals(ZERO))) {// 本币、原币不一致的可能原币已等于0,而本币不等于0 | ||||||
|  |                     continue; | ||||||
|  |                 } else { | ||||||
|  |                     return false; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } else { | ||||||
|  |             UFDouble[] credit = new UFDouble[]{vo1.getCredit_Money_Y(), vo1.getCredit_Money_B()}; | ||||||
|  |             UFDouble[] debit = new UFDouble[]{vo2.getDebit_Money_Y(), vo2.getDebit_Money_B()}; | ||||||
|  |             for (int i = 0; i < debit.length; i++) { | ||||||
|  |                 if ((debit[i].doubleValue() > 0 && credit[i].doubleValue() > 0) | ||||||
|  |                         || (debit[i].doubleValue() < 0 && credit[i].doubleValue() < 0) | ||||||
|  |                         || (debit[i].equals(ZERO) && credit[i].equals(ZERO))) { | ||||||
|  |                     continue; | ||||||
|  |                 } else { | ||||||
|  |                     return false; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param @param  ufdMny 未核销余额 | ||||||
|  |      * @param @return | ||||||
|  |      * @return boolean | ||||||
|  |      * @throws | ||||||
|  |      * @Title: isSettled | ||||||
|  |      * @Description: TODO(判断一条数据的原币和组织本币金额是否已全部核销完) | ||||||
|  |      */ | ||||||
|  |     private boolean isSettled(UFDouble[] ufdMny) { | ||||||
|  |         if (ufdMny == null || ufdMny.length < 1) { | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         for (int i = 0; i < ufdMny.length; i++) { | ||||||
|  |             if (!ufdMny[i].equals(ZERO)) { | ||||||
|  |                 return false; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* (非 Javadoc) | ||||||
|  |      * <p>Title: getPk_accountingbook</p> | ||||||
|  |      * <p>Description: </p> | ||||||
|  |      * @return | ||||||
|  |      * @see nc.vo.glrp.com.verify.IMatchTool#getPk_accountingbook() | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public String getPk_accountingbook() { | ||||||
|  |         return this.pk_accountingbook; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /* (非 Javadoc) | ||||||
|  |      * <p>Title: setPk_accountingbook</p> | ||||||
|  |      * <p>Description: </p> | ||||||
|  |      * @param pkAccountingbook | ||||||
|  |      * @see nc.vo.glrp.com.verify.IMatchTool#setPk_accountingbook(java.lang.String) | ||||||
|  |      */ | ||||||
|  |     @Override | ||||||
|  |     public void setPk_accountingbook(String pkAccountingbook) { | ||||||
|  |         this.pk_accountingbook = pkAccountingbook; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @param @param  verifyMoney 本次核销金额 | ||||||
|  |      * @param @param  voDebit 借方数据 | ||||||
|  |      * @param @param  voCredit 贷方数据 | ||||||
|  |      * @param @return | ||||||
|  |      * @return List<ILogVO> 返回借贷方核销日志VO集合 | ||||||
|  |      * @throws | ||||||
|  |      * @Title: generateLogs | ||||||
|  |      * @Description: TODO(生成一条借方和一条贷方数据核销的核销日志) | ||||||
|  |      */ | ||||||
|  |     private List<ILogVO> generateLogs(UFDouble[] verifyMoney, IVerifyVO voDebit, IVerifyVO voCredit) { | ||||||
|  |         List<ILogVO> logVOList = new ArrayList<ILogVO>(); | ||||||
|  |         // 借方数据核销日志 | ||||||
|  |         ILogVO debitLog = LogVOFactory.getNewLogVO(getRule().getLogClassName()); | ||||||
|  |         debitLog.setBatchID(getRule().getBatchId()); | ||||||
|  |         debitLog.setVerifyObjPK(getRule().getDebitVerifyObj()); | ||||||
|  |         debitLog.setOppVerifyObjPK(getRule().getCreditVerifyObj()); | ||||||
|  |         debitLog.setData(voDebit); | ||||||
|  |         debitLog.setDataPk(voDebit.getPk()); | ||||||
|  |         debitLog.setDebitBalaMny_y(verifyMoney[0]); | ||||||
|  |         debitLog.setDebitBalaMny_b(verifyMoney[1]); | ||||||
|  |         debitLog.setCreDitBalaMny_b(ZERO); | ||||||
|  |         debitLog.setCreDitBalaMny_y(ZERO); | ||||||
|  |         debitLog.setFlag(MainFlag);// todo 1 | ||||||
|  |         debitLog.setOppData(voCredit); | ||||||
|  |         debitLog.setOppDataPk(voCredit.getPk()); | ||||||
|  |         debitLog.setOprDate(getOprDate()); | ||||||
|  |         debitLog.setOprPk(getPk_user()); | ||||||
|  |         // debitLog.setOprType(ILogVO.VERIFY); | ||||||
|  |         debitLog.setOprType(2); // 异币种核销 todo 1 | ||||||
|  |         debitLog.setPairNum(getRule().getNextPairNum()); | ||||||
|  |         debitLog.setPk_group(getPk_group()); | ||||||
|  |         logVOList.add(debitLog); | ||||||
|  |         // 贷方数据核销日志 | ||||||
|  |         ILogVO creditLog = LogVOFactory.getNewLogVO(getRule().getLogClassName()); | ||||||
|  |         creditLog.setBatchID(getRule().getBatchId()); | ||||||
|  |         creditLog.setVerifyObjPK(getRule().getCreditVerifyObj()); | ||||||
|  |         creditLog.setOppVerifyObjPK(getRule().getDebitVerifyObj()); | ||||||
|  |         creditLog.setData(voCredit); | ||||||
|  |         creditLog.setDataPk(voCredit.getPk()); | ||||||
|  |         creditLog.setDebitBalaMny_b(ZERO); | ||||||
|  |         creditLog.setDebitBalaMny_y(ZERO); | ||||||
|  |         creditLog.setCreDitBalaMny_y(verifyMoney[0]); | ||||||
|  |         creditLog.setCreDitBalaMny_b(verifyMoney[1]); | ||||||
|  |         creditLog.setFlag(AssFlag);// todo 1 | ||||||
|  |         creditLog.setOppData(voDebit); | ||||||
|  |         creditLog.setOppDataPk(voDebit.getPk()); | ||||||
|  |         creditLog.setOprDate(getOprDate()); | ||||||
|  |         creditLog.setOprPk(getPk_user()); | ||||||
|  |         // creditLog.setOprType(ILogVO.VERIFY); | ||||||
|  |         creditLog.setOprType(2); // 异币种核销 todo 1 | ||||||
|  |         creditLog.setPairNum(getRule().getPairNum()); | ||||||
|  |         creditLog.setPk_group(getPk_group()); | ||||||
|  |         logVOList.add(creditLog); | ||||||
|  |         return logVOList; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*kOCZ2rdZQh+oO4IyZSOXGg0LHHc/urYgAeiJss7fL0A=*/ | ||||||
		Loading…
	
		Reference in New Issue