凭证合并制单人按转换模板公式取值
This commit is contained in:
		
							parent
							
								
									b82b3ea3d1
								
							
						
					
					
						commit
						837fd009d2
					
				|  | @ -0,0 +1,839 @@ | ||||||
|  | package nc.bs.gl.glvoucher.processor.fip; | ||||||
|  | 
 | ||||||
|  | import nc.bs.dao.BaseDAO; | ||||||
|  | import nc.bs.dao.DAOException; | ||||||
|  | import nc.bs.framework.common.InvocationInfoProxy; | ||||||
|  | import nc.bs.framework.common.NCLocator; | ||||||
|  | import nc.bs.gl.dao.GLBaseDAO; | ||||||
|  | import nc.bs.gl.voucher.service.TempTableUtils; | ||||||
|  | import nc.gl.utils.GLNumUtils; | ||||||
|  | import nc.impl.gl.pub.TempTableCreater; | ||||||
|  | import nc.itf.gl.pub.ICashFlowCase; | ||||||
|  | import nc.jdbc.framework.processor.BeanListProcessor; | ||||||
|  | import nc.vo.fi.pub.SqlUtils; | ||||||
|  | import nc.vo.fip.external.FipBillSumRSVO; | ||||||
|  | import nc.vo.fip.service.FipRelationInfoVO; | ||||||
|  | import nc.vo.fipub.freevalue.GlAssVO; | ||||||
|  | import nc.vo.fipub.freevalue.Module; | ||||||
|  | import nc.vo.fipub.utils.StrTools; | ||||||
|  | import nc.vo.gateway60.itfs.AssByPkThreadCache; | ||||||
|  | import nc.vo.gl.cashflowcase.CashflowcaseVO; | ||||||
|  | import nc.vo.gl.glvoucher.AggNVoucherVO; | ||||||
|  | import nc.vo.gl.glvoucher.NDetailVO; | ||||||
|  | import nc.vo.gl.glvoucher.NVoucherVO; | ||||||
|  | import nc.vo.glcom.ass.AssVO; | ||||||
|  | import nc.vo.glcom.constant.GLVoucherKindConst; | ||||||
|  | import nc.vo.ml.NCLangRes4VoTransl; | ||||||
|  | import nc.vo.pub.BusinessException; | ||||||
|  | import nc.vo.pub.lang.UFDouble; | ||||||
|  | import nc.vo.pubapp.pattern.pub.MapList; | ||||||
|  | import nc.vo.voucher.fip.SchemeConst; | ||||||
|  | 
 | ||||||
|  | import java.sql.SQLException; | ||||||
|  | import java.sql.Types; | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.Arrays; | ||||||
|  | import java.util.Collection; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.HashSet; | ||||||
|  | import java.util.LinkedHashSet; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | import java.util.Set; | ||||||
|  | 
 | ||||||
|  | public class NVoucherSumInDBProcessor extends NVoucherSumProcessor { | ||||||
|  | 	public NVoucherSumInDBProcessor(String pk_sumrule) { | ||||||
|  | 		super(pk_sumrule); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private Map<String, NVoucherVO> mergedHead = new HashMap<>(); | ||||||
|  | 
 | ||||||
|  | 	private MapList<String, NDetailVO> detailContainer = new MapList<>(); | ||||||
|  | 
 | ||||||
|  | 	private MapList<String, String> groupedRelationIdMap = new MapList<>(); | ||||||
|  | 
 | ||||||
|  | 	private MapList<String, FipRelationInfoVO> groupedRelationVOMap = new MapList<>(); | ||||||
|  | 
 | ||||||
|  | 	private Map<String, AssVO[]> assVOMap = new HashMap<>(); | ||||||
|  | 
 | ||||||
|  | 	private String groupTempTableName; | ||||||
|  | 
 | ||||||
|  | 	@Override | ||||||
|  | 	public List<FipBillSumRSVO> processSumData(List<FipBillSumRSVO> sumRSVOs) throws BusinessException { | ||||||
|  | 		fillGroupedRelationMap(sumRSVOs); | ||||||
|  | 		createGroupTempTable(); | ||||||
|  | 		prepareGroupTempTableData(); | ||||||
|  | 		generateMergedHead(); | ||||||
|  | 		loadSchemeInfo(); | ||||||
|  | 		sumDetail(); | ||||||
|  | 		List<AggNVoucherVO> aggVouchers = constructVouchers(); | ||||||
|  | 
 | ||||||
|  | 		List<FipBillSumRSVO> results = new ArrayList<>(); | ||||||
|  | 		for(AggNVoucherVO aggVoucher : aggVouchers) { | ||||||
|  | 			NVoucherSupply4FipProcessor supplyProcessor = new NVoucherSupply4FipProcessor(aggVoucher); | ||||||
|  | 			supplyProcessor.process(); | ||||||
|  | 			FipBillSumRSVO sumRSVO = new FipBillSumRSVO(); | ||||||
|  | 			sumRSVO.setBillVO(aggVoucher); | ||||||
|  | 			NVoucherVO voucher = aggVoucher.getParentVO(); | ||||||
|  | 			String groupId = (String)voucher.getAttributeValue("groupid"); | ||||||
|  | 			sumRSVO.setRelationvos(groupedRelationVOMap.get(groupId).toArray(new FipRelationInfoVO[0])); | ||||||
|  | 			sumRSVO.setMessageinfo(generateMsgInfo(aggVoucher)); | ||||||
|  | 			results.add(sumRSVO); | ||||||
|  | 		} | ||||||
|  | 		return results; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private void fillGroupedRelationMap(Collection<FipBillSumRSVO> sumRsVOs) { | ||||||
|  | 		int groupIndex = 0; //分组号 | ||||||
|  | 		for(FipBillSumRSVO sumRSVO : sumRsVOs) { | ||||||
|  | 			FipRelationInfoVO[] relationInfos = sumRSVO.getRelationvos(); | ||||||
|  | 			if(relationInfos == null || relationInfos.length == 0) { | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			String groupNO = generateGroupNO(++groupIndex); | ||||||
|  | 			for(FipRelationInfoVO relationInfo : relationInfos) { | ||||||
|  | 				groupedRelationIdMap.put(groupNO, relationInfo.getRelationID()); | ||||||
|  | 				groupedRelationVOMap.put(groupNO, relationInfo); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private String generateGroupNO(int groupIndex) { | ||||||
|  | 		int maxLength = 8; | ||||||
|  | 		String groupNO = StrTools.supplementStr(groupIndex, maxLength, '0', true); | ||||||
|  | 		return groupNO; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private void createGroupTempTable() throws BusinessException { | ||||||
|  | 		String[] columns = new String[]{"pk_voucher", "pk_detail", "groupid"}; | ||||||
|  | 		int[] coltype = new int[] {Types.VARCHAR, Types.VARCHAR, Types.VARCHAR}; | ||||||
|  | 		try { | ||||||
|  | 			groupTempTableName = TempTableCreater.createTempTable("tmp_gl_fipsum", columns, coltype); | ||||||
|  | 		} catch (SQLException e) { | ||||||
|  | 			throw new BusinessException(e); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 准备分组临时表数据 | ||||||
|  | 	 * @throws BusinessException | ||||||
|  | 	 */ | ||||||
|  | 	private void prepareGroupTempTableData() throws BusinessException { | ||||||
|  | 		String[] columns = new String[] {"pk_voucher", "groupid"}; | ||||||
|  | 		List<Object[]> datas = new ArrayList<>(); | ||||||
|  | 		for(String groupId : groupedRelationIdMap.keySet()) { | ||||||
|  | 			List<String> pk_vouchers = groupedRelationIdMap.get(groupId); | ||||||
|  | 			for(String pk_voucher : pk_vouchers) { | ||||||
|  | 				Object[] data = new Object[] {pk_voucher, groupId}; | ||||||
|  | 				datas.add(data); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		new GLBaseDAO().excuteInsertBatch(groupTempTableName, columns, datas); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 生成主表合并后数据 | ||||||
|  | 	 * @throws BusinessException | ||||||
|  | 	 */ | ||||||
|  | 
 | ||||||
|  | 	private void generateMergedHead() throws BusinessException { | ||||||
|  | 		String sql = generateMergeHeadSql(); | ||||||
|  | 		List<NVoucherVO> vouchers = new GLBaseDAO().excuteQuery(sql, NVoucherVO.class); | ||||||
|  | 		if(vouchers==null || vouchers.size()==0) { | ||||||
|  | 			throw new BusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("glnvoucher_0", | ||||||
|  | 					"0glnvoucher-0114")/* "查询不到临时凭证,可能是冻结状态" */); | ||||||
|  | 		} | ||||||
|  | 		//针对合并凭证,需要用的制单人转换模板制单人设置公式,其余单据不设置,用min取设置公式的制单人 sunfj | ||||||
|  | 		if(StrTools.isEmptyStr((vouchers.get(0)).getPk_prepared())) { | ||||||
|  | 			String sql2 = sql.replace("max(pk_prepared) as pk_prepared","min(pk_prepared) as pk_prepared " ); | ||||||
|  | 			List<NVoucherVO> vouchers2 = new GLBaseDAO().excuteQuery(sql2, NVoucherVO.class); | ||||||
|  | 			if(vouchers2 != null && !vouchers2.isEmpty()) { | ||||||
|  | 				 vouchers = vouchers2; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		 | ||||||
|  | 		 | ||||||
|  | 		for(NVoucherVO voucher : vouchers) { | ||||||
|  | 			//补充制单人 | ||||||
|  | 			if(StrTools.isEmptyStr(voucher.getPk_prepared())) { | ||||||
|  | 				voucher.setPk_prepared(InvocationInfoProxy.getInstance().getUserId()); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if(voucher.getVoucherkind() == null) { | ||||||
|  | 				voucher.setVoucherkind(GLVoucherKindConst.NORMAL); | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			if(voucher.getPk_exratetype2() == null) { | ||||||
|  | //				RateTypeVO rateTypeVO = new RateTypeThreadCache().getRateTypeByPk_Accountingbook(voucher.getPk_accountingbook()); | ||||||
|  | //				String pk_exratetype2 = RateUtil.getInstance(voucher.getPk_accountingbook()).getDefaultPk_exratetype();//TODO 添加缓存缓存 | ||||||
|  | //				voucher.setPk_exratetype2(rateTypeVO.getPk_ratetype()); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			//FIXME 重置adjustperiod,测试提问题:前台生成列表页面 期间都是空的受不了了 | ||||||
|  | 			if(voucher.getAdjustperiod() == null && voucher.getPeriod()!=null) { | ||||||
|  | 				voucher.setAdjustperiod(voucher.getPeriod()); | ||||||
|  | 			} | ||||||
|  | 			 | ||||||
|  | 			String groupid = (String)voucher.getAttributeValue("groupid"); | ||||||
|  | 			if(mergedHead.get(groupid) != null) { | ||||||
|  | 				throw new BusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("glnvoucher_0","0glnvoucher-0014")/*@res "数据中因为有些字段不同,有不能合并成一张凭证的情况,请检查下面的字段是否相同:集团,组织,财务核算账簿,凭证类别,交易类型,自定义项。"*/); | ||||||
|  | 			} | ||||||
|  | 			mergedHead.put(groupid, voucher); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		combinSystem(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private void loadSchemeInfo() throws BusinessException { | ||||||
|  | 		NVoucherVO voucher = mergedHead.values().toArray(new NVoucherVO[0])[0]; | ||||||
|  | 		String pk_accountingbook = voucher.getPk_accountingbook(); | ||||||
|  | 		String versionDate = voucher.getPrepareddate().toStdString(); | ||||||
|  | 		loadSchemeInfo(pk_accountingbook, versionDate); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private void sumDetail() throws BusinessException { | ||||||
|  | 		String[] sumSqls = getSumSql(); | ||||||
|  | 		String[] normalSqls = getNormalSql(); | ||||||
|  | 
 | ||||||
|  | 		String[] sumConditions = getSumConditions(); | ||||||
|  | 		String unSumCondition = getUnSumCondition(); | ||||||
|  | 
 | ||||||
|  | 		if(sumConditions != null && sumConditions.length > 0) { | ||||||
|  | 			for(String sumCondition : sumConditions) { | ||||||
|  | 				String sql = sumSqls[0] + sumSqls[1] + sumSqls[2] + sumCondition + sumSqls[3] + sumSqls[4]; | ||||||
|  | 				MapList<String, NDetailVO> results = queryDetailsBySql(sql); | ||||||
|  | 				//cat 现金流量 | ||||||
|  | 				catCashFlowCaseForSum(results, sumSqls[3].substring(6), sumSqls[1], sumCondition); | ||||||
|  | 				mixDetail(detailContainer, results);   | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if(isCombinSameAccount()) { | ||||||
|  | 			if(unSumCondition != null && unSumCondition.length() > 0) { | ||||||
|  | 				String sql = normalSqls[0] + normalSqls[1] + normalSqls[2] + unSumCondition + normalSqls[3] + normalSqls[4]; | ||||||
|  | 				MapList<String, NDetailVO> results = queryDetailsBySql(sql); | ||||||
|  | 				//cat 现金流量 | ||||||
|  | 				catCashFlowCase(results); | ||||||
|  | 				mixDetail(detailContainer, results); | ||||||
|  | 			} | ||||||
|  | 		}else { | ||||||
|  | 			String sql = normalSqls[0] + normalSqls[1] + normalSqls[2] + unSumCondition + normalSqls[3] + normalSqls[4]; | ||||||
|  | 			MapList<String, NDetailVO> results = queryDetailsBySql(sql); | ||||||
|  | 			//cat 现金流量 | ||||||
|  | 			catCashFlowCase(results); | ||||||
|  | 			mixDetail(detailContainer, results); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 构造凭证 | ||||||
|  | 	 * modify 2022-02-23 没有分录返回主表信息 | ||||||
|  | 	 * @return | ||||||
|  | 	 * @throws BusinessException | ||||||
|  | 	 */ | ||||||
|  | 	private List<AggNVoucherVO> constructVouchers() throws BusinessException{ | ||||||
|  | 		List<AggNVoucherVO> results= new ArrayList<>(); | ||||||
|  | 		//加载辅助核算信息 | ||||||
|  | 		loadAssInfo(); | ||||||
|  | 		//TODO 加载科目信息 | ||||||
|  | 
 | ||||||
|  | 		String[] groupIds = groupedRelationIdMap.keySet().toArray(new String[0]); | ||||||
|  | 		Arrays.sort(groupIds);//分组id排序 | ||||||
|  | 
 | ||||||
|  | 		for(String groupid : groupIds) { | ||||||
|  | 
 | ||||||
|  | 			NVoucherVO voucher = mergedHead.get(groupid); | ||||||
|  | 			List<NDetailVO> details = detailContainer.get(groupid); | ||||||
|  | 			 | ||||||
|  | 			if(details == null) { | ||||||
|  | 				details = new ArrayList<>(); | ||||||
|  | 			} | ||||||
|  | 			//补充ASSVO | ||||||
|  | 			for(NDetailVO detail : details) { | ||||||
|  | 				if(StrTools.isEmptyStr(detail.getAssid())) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				if(detail.getAssvos() == null) { | ||||||
|  | 					AssVO[] assVOs = assVOMap.get(detail.getAssid()); | ||||||
|  | 					detail.setAssvos(assVOs); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 			AggNVoucherVO aggVoucher = combinAggVoucher(voucher, details); | ||||||
|  | 			results.add(aggVoucher); | ||||||
|  | 
 | ||||||
|  | 		} | ||||||
|  | 		return results; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 生成合并表头的sql | ||||||
|  | 	 * TODO 交易类型 | ||||||
|  | 	 * @return | ||||||
|  | 	 */ | ||||||
|  | 	private String generateMergeHeadSql() { | ||||||
|  | 		StringBuilder sql = new StringBuilder(); | ||||||
|  | 		sql.append("select b.groupid as groupid,pk_group, pk_org,pk_accountingbook,pk_vouchertype, pk_tradetype, 'C0' as pk_billtype, ") | ||||||
|  | 		.append("max(year) as year, max(period) as period, 0 as no, max(prepareddate) as prepareddate, null as pk_system,") | ||||||
|  | 		.append(" null as tallydate, sum(attachment) as attachment, max(pk_prepared) as pk_prepared, null as checker, null as casher, ") | ||||||
|  | 		.append(" null as manager, min(signflag) as signflag,  min(modifyflag) as modifyflag, 'N' as discardflag, max(addclass) as addclass,") | ||||||
|  | 		.append(" max(deleteclass) as deleteclass, min(DETAILMODFLAG) as detailModflag, ") | ||||||
|  | 		.append(" null as pk_billtype, "); | ||||||
|  | 		for(int i = 1; i<= 30; i++) { | ||||||
|  | 			sql.append(" vdef").append(i).append(","); | ||||||
|  | 		} | ||||||
|  | 		sql.append(" null as pk_voucher, max(pk_exratetype2) as pk_exratetype2 "); | ||||||
|  | 
 | ||||||
|  | 		sql.append("from gl_rtvoucher a inner join ").append(groupTempTableName).append(" b on a.pk_voucher = b.pk_voucher "); | ||||||
|  | 		sql.append("group by groupid,pk_group,pk_org,pk_accountingbook,pk_vouchertype,pk_tradetype,"); | ||||||
|  | 		for(int i = 1; i<= 30; i++) { | ||||||
|  | 			sql.append(" vdef").append(i).append(","); | ||||||
|  | 		} | ||||||
|  | 		sql.deleteCharAt(sql.length() - 1); | ||||||
|  | 		return sql.toString(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 合并制单系统 | ||||||
|  | 	 * @throws DAOException | ||||||
|  | 	 */ | ||||||
|  | 	private void combinSystem() throws DAOException { | ||||||
|  | 		Map<String, String> combinSystemMap = queryCombinSystem(); | ||||||
|  | 		for(String groupid : mergedHead.keySet()) { | ||||||
|  | 			NVoucherVO voucher = mergedHead.get(groupid); | ||||||
|  | 			voucher.setPk_system(combinSystemMap.get(groupid)); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 查询制单系统 | ||||||
|  | 	 * @return | ||||||
|  | 	 * @throws DAOException | ||||||
|  | 	 */ | ||||||
|  | 	private Map<String, String> queryCombinSystem() throws DAOException{ | ||||||
|  | 		String sql = "select distinct groupid,pk_system from gl_rtvoucher a inner join " | ||||||
|  | 				+ groupTempTableName + " b on a.pk_voucher = b.pk_voucher where isnull(groupid, '~') <> '~'"; | ||||||
|  | 		List<Map<String, Object>> groupSystemList = new GLBaseDAO().excuteQuery(sql); | ||||||
|  | 
 | ||||||
|  | 		MapList<String, String> groupedSystem = new MapList<>(); | ||||||
|  | 		for(Map<String, Object> groupSystem : groupSystemList) { | ||||||
|  | 			String pk_system = (String)groupSystem.get("pk_system"); | ||||||
|  | 			if(pk_system != null) { | ||||||
|  | 				groupedSystem.put((String)groupSystem.get("groupid"), pk_system.trim()); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		Map<String, String> result = new HashMap<>(); | ||||||
|  | 		for(String groupid : groupedSystem.keySet()) { | ||||||
|  | 			List<String> systems = groupedSystem.get(groupid); | ||||||
|  | 			if(systems != null && systems.size() > 0) { | ||||||
|  | 				//去重 | ||||||
|  | 				Set<String> systemSet = new LinkedHashSet<String>(); | ||||||
|  | 				systemSet.addAll(systems); | ||||||
|  | 
 | ||||||
|  | 				result.put(groupid, StrTools.join(systemSet.iterator(), ",")); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return result; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 0 select | ||||||
|  | 	 * 1 from | ||||||
|  | 	 * 2 where | ||||||
|  | 	 * 3 group | ||||||
|  | 	 * 4 order | ||||||
|  | 	 * @return | ||||||
|  | 	 */ | ||||||
|  | 	private String[] getSumSql() { | ||||||
|  | 		String[] results = new String[5]; | ||||||
|  | 		results[0] = generateSumSelectSql(); | ||||||
|  | 		results[1] = " from gl_rtdetail a inner join " + groupTempTableName + " b on a.pk_voucher = b.pk_voucher "; | ||||||
|  | 		results[2] = " where a.dr = 0 "; | ||||||
|  | 		results[3] = generateSumGroupSql(); | ||||||
|  | 		results[4] = " order by groupid "; | ||||||
|  | 
 | ||||||
|  | 		if(isCombinExplan()) { | ||||||
|  | 			results[0] = results[0].replaceFirst("a.explanation", "max(a.explanation)"); | ||||||
|  | 			results[3] = results[3].replaceFirst(",a.explanation,", ","); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if(isCombinPrice()) { | ||||||
|  | 			results[0] = results[0].replaceFirst("a.price", "sum(a.price)"); | ||||||
|  | 			results[3] = results[3].replaceFirst(", a.price,", ","); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if(isCombinExrateInfo()) { | ||||||
|  | 			results[0] = results[0].replaceFirst("a." + NDetailVO.PK_EXRATETYPE2, "max(a." + NDetailVO.PK_EXRATETYPE2 + ")"); | ||||||
|  | 			results[0] = results[0].replaceFirst("a." + NDetailVO.EXRATEDATE2, "max(a." + NDetailVO.EXRATEDATE2 + ")"); | ||||||
|  | 			results[3] = results[3].replaceFirst(", " + NDetailVO.PK_EXRATETYPE2 + ",", ","); | ||||||
|  | 			results[3] = results[3].replaceFirst(", " + NDetailVO.EXRATEDATE2 + ",", ","); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return results; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 0 select | ||||||
|  | 	 * 1 from | ||||||
|  | 	 * 2 where | ||||||
|  | 	 * 3 group | ||||||
|  | 	 * 4 order | ||||||
|  | 	 * @return | ||||||
|  | 	 */ | ||||||
|  | 	private String[] getNormalSql() { | ||||||
|  | 		String[] results = new String[5]; | ||||||
|  | 		results[0] = generateNormalSelectSql(); | ||||||
|  | 		results[1] = " from gl_rtdetail a inner join " + groupTempTableName + " b on a.pk_voucher = b.pk_voucher "; | ||||||
|  | 		results[2] = " where a.dr = 0 "; | ||||||
|  | 		results[3] = ""; | ||||||
|  | 		results[4] = " order by groupid "; | ||||||
|  | 
 | ||||||
|  | 		return results; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private List<String[]> generateDetailFields() { | ||||||
|  | 		/** | ||||||
|  | 		 * 第一个字段 为 a | ||||||
|  | 		 * 第二个字段 | ||||||
|  | 		 * "null" => null as a | ||||||
|  | 		 * null => a as a | ||||||
|  | 		 * min => min(a) as a | ||||||
|  | 		 * max => max(a) as a | ||||||
|  | 		 * sum => sum(a) as a | ||||||
|  | 		 */ | ||||||
|  | 		List<String[]> fields = new ArrayList<>(); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PK_DETAIL, "min"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.NOV, "null"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.OPPOSITESUBJ, "null"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.BANKACCOUNT, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PK_VOUCHER, "null"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PK_ORG, "min"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.MODIFYFLAG, "min"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.RECIEPTCLASS, "min"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.DEBITAMOUNT, "sum"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.DEBITQUANTITY, "sum"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.LOCALDEBITAMOUNT, "sum"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.GROUPDEBITAMOUNT, "sum"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.GLOBALDEBITAMOUNT, "sum"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.CREDITAMOUNT, "sum"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.CREDITQUANTITY, "sum"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.LOCALCREDITAMOUNT, "sum"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.GROUPCREDITAMOUNT, "sum"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.GLOBALCREDITAMOUNT, "sum"}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PK_ACCOUNTINGBOOK, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PK_UNIT, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PK_UNIT_V, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PK_VOUCHERTYPEV, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.YEARV, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PERIODV, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.EXPLANATION, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PK_ACCASOA, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.ASSID, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PK_CURRTYPE, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PRICE, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.EXCRATE2, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.EXCRATE3, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.EXCRATE4, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.CHECKSTYLE, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.CHECKNO, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.CHECKDATE, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.BILLTYPE, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.BUSIRECONNO, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.NETBANKFLAG, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.VERIFYDATE, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.VERIFYNO, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PK_LIABILITYCENTER, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PK_LIABILITYCENTER_V, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.PK_EXRATETYPE2, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.EXRATEDATE2, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.DUEDATE, null}); | ||||||
|  | 		fields.add(new String[] {NDetailVO.ORDERSTR, "max"}); | ||||||
|  | 		for(int i = 1; i <= 80 ;i ++) { | ||||||
|  | 			fields.add(new String[] {"vbdef" + i, null}); | ||||||
|  | 		} | ||||||
|  | 		return fields; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private String generateSumColumnStr(String tableAlias, String[] field) { | ||||||
|  | 		StringBuilder columnStr = new StringBuilder(" "); | ||||||
|  | 		String fieldName = field[0]; | ||||||
|  | 		String oper = field[1]; | ||||||
|  | 		if(oper == null) { | ||||||
|  | 			columnStr.append(tableAlias).append(".").append(fieldName); | ||||||
|  | 		}else if(oper.equals("null")) { | ||||||
|  | 			columnStr.append("null"); | ||||||
|  | 		}else if(oper.equals("sum")) { | ||||||
|  | 			columnStr.append("sum(").append(tableAlias).append(".").append(fieldName).append(")"); | ||||||
|  | 		}else if(oper.equals("min")) { | ||||||
|  | 			columnStr.append("min(").append(tableAlias).append(".").append(fieldName).append(")"); | ||||||
|  | 		}else if(oper.equals("max")){ | ||||||
|  | 			columnStr.append("max(").append(tableAlias).append(".").append(fieldName).append(")"); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		columnStr.append(" as ").append(fieldName); | ||||||
|  | 		return columnStr.toString(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private String generateSumSelectSql() { | ||||||
|  | 		StringBuilder selectSql = new StringBuilder("select "); | ||||||
|  | 		List<String[]> fields = generateDetailFields(); | ||||||
|  | 		for(String[] field : fields) { | ||||||
|  | 			selectSql.append(generateSumColumnStr("a", field)); | ||||||
|  | 			selectSql.append(", "); | ||||||
|  | 		} | ||||||
|  | 		selectSql.append("b.groupid as groupid "); | ||||||
|  | 		return selectSql.toString(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private String generateSumGroupSql() { | ||||||
|  | 		StringBuilder groupSql = new StringBuilder(); | ||||||
|  | 		groupSql.append(" group by b.groupid,a.pk_accountingbook,a.pk_unit,a.pk_unit_v,pk_vouchertypev,yearv,periodv,a.explanation,"); | ||||||
|  | 		groupSql.append(" a.pk_accasoa, assid, pk_currtype, a.price, excrate2, excrate3,excrate4,bankaccount,checkstyle, checkno,"); | ||||||
|  | 		groupSql.append(" checkdate, billtype, innerbusno, innerbusdate, busireconno,netbankflag, verifydate, verifyno, "); | ||||||
|  | 		groupSql.append(" pk_liabilitycenter, pk_liabilitycenter_v, duedate, "); | ||||||
|  | 
 | ||||||
|  | 		for(int i = 1; i <= 80; i++) { | ||||||
|  | 			groupSql.append("vbdef").append(i).append(","); | ||||||
|  | 		} | ||||||
|  | 		groupSql.append(" pk_exratetype2, exratedate2 "); | ||||||
|  | 		return groupSql.toString(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private String generateNormalSelectSql() { | ||||||
|  | 		StringBuilder selectSql = new StringBuilder(); | ||||||
|  | 		selectSql.append("select "); | ||||||
|  | 		List<String[]> fields = generateDetailFields(); | ||||||
|  | 		for(String[] field : fields) { | ||||||
|  | 			selectSql.append(" a.").append(field[0]).append(" as ").append(field[0]); | ||||||
|  | 			selectSql.append(", "); | ||||||
|  | 		} | ||||||
|  | 		selectSql.append(" b.groupid as groupid "); | ||||||
|  | 		return selectSql.toString(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 构造需要合并的查询条件 | ||||||
|  | 	 * @return | ||||||
|  | 	 * @throws BusinessException | ||||||
|  | 	 */ | ||||||
|  | 	private String[] getSumConditions() throws BusinessException { | ||||||
|  | 		List<String> conditions = new ArrayList<>(); | ||||||
|  | 
 | ||||||
|  | 		boolean isCombinAccount = isCombinSameAccount(); | ||||||
|  | 
 | ||||||
|  | 		StringBuilder condition = new StringBuilder(); | ||||||
|  | 		if(isCombinAccount) {//合并科目,排除例外科目 | ||||||
|  | 			//科目条件 | ||||||
|  | 			if(getExAccountPks() != null && getExAccountPks().length > 0) { | ||||||
|  | 				String inAccountSql = SqlUtils.getInStr("a.pk_accasoa", getExAccountPks(),Boolean.TRUE); | ||||||
|  | 				String notInAccountSql = inAccountSql.replaceFirst("in", "not in"); | ||||||
|  | 				condition.append(" and ").append(notInAccountSql); | ||||||
|  | 			} | ||||||
|  | 		}else {//不合并科目,则只合并例外科目 | ||||||
|  | 			if(getExAccountPks() == null || getExAccountPks().length == 0) { | ||||||
|  | 				return null; | ||||||
|  | 			}else { | ||||||
|  | 				String inAccountSql = SqlUtils.getInStr("a.pk_accasoa", getExAccountPks(),Boolean.TRUE); | ||||||
|  | 				condition.append(" and ").append(inAccountSql); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		//借贷条件 | ||||||
|  | 		if(SchemeConst.COMBINTYPE_D.equals(getCominType())){ | ||||||
|  | 			condition.append(" and ").append("(debitquantity<>0 or localdebitamount<>0 or groupdebitamount<>0 or globaldebitamount<>0) "); | ||||||
|  | 			conditions.add(condition.toString()); | ||||||
|  | 		}else if(SchemeConst.COMBINTYPE_C.equals(getCominType())) { | ||||||
|  | 			condition.append(" and ").append("(creditquantity<>0 or localcreditamount<>0 or groupcreditamount<>0 or globalcreditamount<>0) "); | ||||||
|  | 			conditions.add(condition.toString()); | ||||||
|  | 		}else { | ||||||
|  | 			if(isCombinDiffDirection()) { | ||||||
|  | 				conditions.add(condition.toString()); | ||||||
|  | 			}else {				 | ||||||
|  | 				//借方条件 | ||||||
|  | 				String conditionDebit = condition.toString() + " and (debitquantity<>0 or localdebitamount<>0 or groupdebitamount<>0 or globaldebitamount<>0) "; | ||||||
|  | 				conditions.add(conditionDebit); | ||||||
|  | 				//贷方条件 | ||||||
|  | 				String conditionCredit = condition.toString() + " and (creditquantity<>0 or localcreditamount<>0 or groupcreditamount<>0 or globalcreditamount<>0) "; | ||||||
|  | 				conditions.add(conditionCredit); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return conditions.toArray(new String[0]); | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 构造不需要合并的查询条件 | ||||||
|  | 	 * @return null 说明 不合并科目且没有例外科目,全部采用不合并逻辑处理 | ||||||
|  | 	 * @throws BusinessException | ||||||
|  | 	 */ | ||||||
|  | 	private String getUnSumCondition() throws BusinessException { | ||||||
|  | 		StringBuilder condition = new StringBuilder(); | ||||||
|  | 
 | ||||||
|  | 		if(isCombinSameAccount()) { | ||||||
|  | 			if(getExAccountPks() != null && getExAccountPks().length > 0) { | ||||||
|  | 				String inAccountSql = SqlUtils.getInStr("a.pk_accasoa", getExAccountPks(),Boolean.TRUE); | ||||||
|  | 				condition.append(inAccountSql); | ||||||
|  | 			} | ||||||
|  | 		}else { | ||||||
|  | 			if(getExAccountPks() != null && getExAccountPks().length > 0) { | ||||||
|  | 				String inAccountSql = SqlUtils.getInStr("a.pk_accasoa", getExAccountPks(),Boolean.TRUE); | ||||||
|  | 				String notInAccountSql = inAccountSql.replaceFirst("in", "not in"); | ||||||
|  | 				condition.append(notInAccountSql); | ||||||
|  | 			}else { | ||||||
|  | 				return ""; | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if(SchemeConst.COMBINTYPE_D.equals(getCominType())) { | ||||||
|  | 			if(condition.length() > 0){ | ||||||
|  | 				condition.append(" or "); | ||||||
|  | 			} | ||||||
|  | 			condition.append("(creditquantity<>0 or localcreditamount<>0 or groupcreditamount<>0 or globalcreditamount<>0) "); | ||||||
|  | 		}else if(SchemeConst.COMBINTYPE_C.equals(getCominType())) { | ||||||
|  | 			if(condition.length() > 0){ | ||||||
|  | 				condition.append(" or "); | ||||||
|  | 			} | ||||||
|  | 			condition.append(" (debitquantity<>0 or localdebitamount<>0 or groupdebitamount<>0 or globaldebitamount<>0) "); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if(condition.length() > 0) { | ||||||
|  | 			condition.insert(0, " and ("); | ||||||
|  | 			condition.append(") "); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return condition.toString(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private MapList<String, NDetailVO> queryDetailsBySql(String sql) throws DAOException{ | ||||||
|  | 		MapList<String, NDetailVO> results = new MapList<>(); | ||||||
|  | 		@SuppressWarnings("unchecked") | ||||||
|  | 		List<NDetailVO> details = (List<NDetailVO>)new BaseDAO().executeQuery(sql, new BeanListProcessor(NDetailVO.class)); | ||||||
|  | 		if(details != null && details.size() > 0) { | ||||||
|  | 			for(NDetailVO detail : details) { | ||||||
|  | 				results.put((String)detail.getAttributeValue("groupid"), detail); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return results; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private void mixDetail(MapList<String, NDetailVO> container, MapList<String, NDetailVO> queryResults) { | ||||||
|  | 		if(queryResults != null) { | ||||||
|  | 			for(String key : queryResults.keySet()) { | ||||||
|  | 				container.putAll(key, queryResults.get(key)); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private boolean isAllZero(NDetailVO detail) { | ||||||
|  | 		return GLNumUtils.allZero( | ||||||
|  | 				detail.getCreditquantity(), detail.getDebitquantity(), | ||||||
|  | 				detail.getCreditamount(), detail.getDebitamount(), | ||||||
|  | 				detail.getLocalcreditamount(), detail.getLocaldebitamount(), | ||||||
|  | 				detail.getGroupcreditamount(), detail.getGroupdebitamount(), | ||||||
|  | 				detail.getGlobalcreditamount(), detail.getGlobaldebitamount() | ||||||
|  | 				); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/** | ||||||
|  | 	 * 参数顺序决定优先级 | ||||||
|  | 	 * | ||||||
|  | 	 * result > 0 借 | ||||||
|  | 	 * result < 0 贷 | ||||||
|  | 	 * result == 0 平 | ||||||
|  | 	 * @return | ||||||
|  | 	 */ | ||||||
|  | 	private int detailDirection(UFDouble... amounts) { | ||||||
|  | 		for(UFDouble amount : amounts) { | ||||||
|  | 			if(amount.compareTo(UFDouble.ZERO_DBL) != 0) { | ||||||
|  | 				return amount.compareTo(UFDouble.ZERO_DBL); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		return 0; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private int detailDirection(NDetailVO detail) { | ||||||
|  | 		UFDouble amount = GLNumUtils.sub(detail.getDebitamount(), detail.getCreditamount()); | ||||||
|  | 		UFDouble quantity = GLNumUtils.sub(detail.getDebitquantity(), detail.getCreditquantity()); | ||||||
|  | 		UFDouble localAmount = GLNumUtils.sub(detail.getLocaldebitamount(), detail.getLocalcreditamount()); | ||||||
|  | 		UFDouble groupAmount = GLNumUtils.sub(detail.getGroupdebitamount(), detail.getGroupcreditamount()); | ||||||
|  | 		UFDouble globalAmount = GLNumUtils.sub(detail.getGlobaldebitamount(), detail.getGlobalcreditamount()); | ||||||
|  | 		return detailDirection(localAmount, groupAmount, globalAmount, amount, quantity); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private void clearAmount(NDetailVO detail, boolean isDebit) { | ||||||
|  | 		if(isDebit) { | ||||||
|  | 			detail.setDebitquantity(UFDouble.ZERO_DBL); | ||||||
|  | 			detail.setDebitamount(UFDouble.ZERO_DBL); | ||||||
|  | 			detail.setLocaldebitamount(UFDouble.ZERO_DBL); | ||||||
|  | 			detail.setGroupdebitamount(UFDouble.ZERO_DBL); | ||||||
|  | 			detail.setGlobaldebitamount(UFDouble.ZERO_DBL); | ||||||
|  | 		}else { | ||||||
|  | 			detail.setCreditquantity(UFDouble.ZERO_DBL); | ||||||
|  | 			detail.setCreditamount(UFDouble.ZERO_DBL); | ||||||
|  | 			detail.setLocalcreditamount(UFDouble.ZERO_DBL); | ||||||
|  | 			detail.setGroupcreditamount(UFDouble.ZERO_DBL); | ||||||
|  | 			detail.setGlobalcreditamount(UFDouble.ZERO_DBL); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private void loadAssInfo() throws BusinessException { | ||||||
|  | 		Set<String> assidSet = new HashSet<>(); | ||||||
|  | 		for(String groupid : detailContainer.keySet()) { | ||||||
|  | 			List<NDetailVO> details = detailContainer.get(groupid); | ||||||
|  | 			if(details == null || details.size() == 0) { | ||||||
|  | 				continue; | ||||||
|  | 			} | ||||||
|  | 			for(NDetailVO detail : details) { | ||||||
|  | 				if(detail == null) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				if(!StrTools.isEmptyStr(detail.getAssid())) { | ||||||
|  | 					assidSet.add(detail.getAssid()); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		if(assidSet.size() == 0) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | //		IFreevaluePub freevalue = (IFreevaluePub) NCLocator.getInstance().lookup(IFreevaluePub.class.getName()); | ||||||
|  | //		GlAssVO[] glAssVOs = freevalue.queryAllByIDs(assidSet.toArray(new String[0]),null,Module.GL); | ||||||
|  | 		GlAssVO[] glAssVOs = AssByPkThreadCache.getInstance().getAssVO(assidSet.toArray(new String[0]), Module.GL); | ||||||
|  | 		if(glAssVOs != null && glAssVOs.length>0) { | ||||||
|  | 			for(int i=0;i<glAssVOs.length;i++) { | ||||||
|  | 				String assID = glAssVOs[i].getAssID(); | ||||||
|  | 				assVOMap.put(assID, glAssVOs[i].getAssVos()); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private void catCashFlowCaseForSum(MapList<String, NDetailVO> details, String groupByStr, String fromStr, String sumSqlWherePart) throws BusinessException { | ||||||
|  | 		if(details == null || details.size() == 0) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		String querysql = "select a.pk_detail,min(a.pk_detail) over(partition " + groupByStr + ") as groupid " + fromStr + "" + (sumSqlWherePart == null ? "" : sumSqlWherePart); | ||||||
|  | 
 | ||||||
|  | 		String tablename = "T_DETAILGROUP"; | ||||||
|  | 		String pkfield = "pk_detail"; | ||||||
|  | 		String groupfield = "groupid"; | ||||||
|  | 		try { | ||||||
|  | 			tablename = TempTableUtils.createTempTable(tablename, " " + pkfield + " varchar(40), " + groupfield + " varchar(40) ", null); | ||||||
|  | 		} catch (SQLException e) { | ||||||
|  | 			throw new BusinessException(e); | ||||||
|  | 		} | ||||||
|  | 		String insertsql = "insert into " + tablename + " (" + pkfield + "," + groupfield + ") (" + querysql + ")"; | ||||||
|  | 		new GLBaseDAO().excuteUpdate(insertsql); | ||||||
|  | 
 | ||||||
|  | 		// 获得现金流量信息 | ||||||
|  | 		String[] tableinfo = new String[] { | ||||||
|  | 				tablename, pkfield, groupfield | ||||||
|  | 		}; | ||||||
|  | 
 | ||||||
|  | 		ICashFlowCase cashflowproxy = (ICashFlowCase) NCLocator.getInstance().lookup(ICashFlowCase.class.getName()); | ||||||
|  | 		CashflowcaseVO[] cashvo = cashflowproxy.querySumCashflow4Fip(tableinfo); | ||||||
|  | 
 | ||||||
|  | 		if(cashvo == null || cashvo.length == 0) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		//补充币种信息 | ||||||
|  | 
 | ||||||
|  | 		MapList<String, CashflowcaseVO> cashflowCaseMapList = new MapList<>(); | ||||||
|  | 		for (CashflowcaseVO cashflowcaseVO : cashvo) { | ||||||
|  | 			cashflowCaseMapList.put(cashflowcaseVO.getPk_detail(), cashflowcaseVO); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		ArrayList<String> extGroup = new ArrayList<String>();// 需要展开不汇总的分组,这是由于该组分录合计为0可是又有现金流量造成的 | ||||||
|  | 
 | ||||||
|  | 		for(String groupId : details.keySet()) { | ||||||
|  | 			List<NDetailVO> detailList = details.get(groupId); | ||||||
|  | 			List<NDetailVO> newDetails = new ArrayList<>(); | ||||||
|  | 			for(NDetailVO detail : detailList) { | ||||||
|  | 				List<CashflowcaseVO> cashflowList = cashflowCaseMapList.get(detail.getPk_detail()); | ||||||
|  | 				if(cashflowList == null || cashflowList.isEmpty()) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				cashFlowCaseFillCurrtype(cashflowList, detail.getPk_currtype()); | ||||||
|  | 
 | ||||||
|  | 				if(isAllZero(detail)) { | ||||||
|  | 					extGroup.add(detail.getPk_detail()); | ||||||
|  | 				}else { | ||||||
|  | 					// 金额的校验,有现金流量的分录不允许出现借贷合计为0的情况,因为借贷合计为0的分录可能被删除,会缺失部分现金流量数据 | ||||||
|  | 					if(detailDirection(detail) == 0) { | ||||||
|  | 						NDetailVO newDetail = (NDetailVO) detail.clone(); | ||||||
|  | 						clearAmount(detail, false); | ||||||
|  | 						clearAmount(newDetail, true); | ||||||
|  | 						newDetails.add(newDetail); | ||||||
|  | 					} | ||||||
|  | 					detail.setCashflow(cashflowList.toArray(new CashflowcaseVO[0])); | ||||||
|  | 				} | ||||||
|  | 				cashflowCaseMapList.remove(detail.getPk_detail()); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if (cashflowCaseMapList.size() > 0) { | ||||||
|  | 			throw new BusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("glnvoucher_0","0glnvoucher-0015")/*@res "补现金流量出错,分录和现金流量表的分组不一致造成部分现金流量没有归属。"*//*-=notranslate=-*/); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		//FIXME 原有逻辑在这里将合并后借贷为0,现金流量不为0的分录补充了回来,但是后续并没有使用,这里先不补充 | ||||||
|  | 
 | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 	private void catCashFlowCase(MapList<String, NDetailVO> details) throws BusinessException { | ||||||
|  | 		if(details == null || details.size() == 0) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		List<String> pk_details = new ArrayList<>(); | ||||||
|  | 		Map<String, String> detailCurrTypeMap = new HashMap<>(); | ||||||
|  | 		for(String groupid : details.keySet()) { | ||||||
|  | 			for(NDetailVO detail : details.get(groupid)) { | ||||||
|  | 				pk_details.add(detail.getPk_detail()); | ||||||
|  | 				detailCurrTypeMap.put(detail.getPk_detail(), detail.getPk_currtype()); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		ICashFlowCase cashflowproxy = (ICashFlowCase) NCLocator.getInstance().lookup(ICashFlowCase.class.getName()); | ||||||
|  | 		CashflowcaseVO[] cashflowcasevos = cashflowproxy.queryByPKRtDetails(pk_details.toArray(new String[0])); | ||||||
|  | 		if(cashflowcasevos == null || cashflowcasevos.length == 0) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		// 如果不是总帐凭证,那么这个接口读出来的CashflowcaseVO里有可能没有币种信息,需要补上 | ||||||
|  | 		for(CashflowcaseVO caseVO : cashflowcasevos) { | ||||||
|  | 			if(caseVO != null && StrTools.isEmptyStr(caseVO.getM_pk_currtype())) { | ||||||
|  | 				caseVO.setM_pk_currtype(detailCurrTypeMap.get(caseVO.getPk_detail())); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		MapList<String, CashflowcaseVO> caseMapList = new MapList<>(); | ||||||
|  | 		for(CashflowcaseVO caseVO : cashflowcasevos) { | ||||||
|  | 			caseMapList.put(caseVO.getPk_detail(), caseVO); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		for(String groupid : details.keySet()) { | ||||||
|  | 			for(NDetailVO detail : details.get(groupid)) { | ||||||
|  | 				List<CashflowcaseVO> caseVOs = caseMapList.get(detail.getPk_detail()); | ||||||
|  | 				if(caseVOs == null || caseVOs.isEmpty()) { | ||||||
|  | 					continue; | ||||||
|  | 				} | ||||||
|  | 				detail.setCashflow(caseVOs.toArray(new CashflowcaseVO[0])); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	private void cashFlowCaseFillCurrtype(List<CashflowcaseVO> cashflowCases, String defaultCurrtype) { | ||||||
|  | 		for(CashflowcaseVO caseVO : cashflowCases) { | ||||||
|  | 			if(caseVO != null && StrTools.isEmptyStr(caseVO.getM_pk_currtype())) { | ||||||
|  | 				caseVO.setM_pk_currtype(defaultCurrtype); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue