Parcourir la source

处理内部应收单审批生成协同单据内部应付单付款部门字段

lyr il y a 5 jours
Parent
commit
a6c6734d8b
1 fichiers modifiés avec 776 ajouts et 0 suppressions
  1. 776 0
      arap/arap/src/private/nc/bs/arap/busireg/BConferUtils.java

+ 776 - 0
arap/arap/src/private/nc/bs/arap/busireg/BConferUtils.java

@@ -0,0 +1,776 @@
+package nc.bs.arap.busireg;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import nc.bs.arap.actions.BillDeleteBatchBSAction;
+import nc.bs.arap.bill.ArapBillPubUtil;
+import nc.bs.arap.util.ArapBillVOUtils;
+import nc.bs.arap.util.BillMoneyVUtils;
+import nc.bs.arap.util.SqlUtils;
+import nc.bs.bd.util.DBAUtil;
+import nc.bs.dao.BaseDAO;
+import nc.bs.framework.common.NCLocator;
+import nc.bs.pf.pub.PfDataCache;
+import nc.bs.pub.pf.PfUtilTools;
+import nc.impl.pubapp.pattern.data.bill.BillDelete;
+import nc.impl.pubapp.pattern.data.bill.BillOperator;
+import nc.itf.arap.billconfer.IBConferMapQryService;
+import nc.itf.arap.billconfer.IBConferMapService;
+import nc.itf.arap.billconfer.IBillConferQueryService;
+import nc.itf.arap.fieldmap.IBillFieldGet;
+import nc.pubitf.arap.bill.IArapBillPubQueryService;
+import nc.pubitf.para.SysInitQuery;
+import nc.vo.arap.basebill.BaseAggVO;
+import nc.vo.arap.basebill.BaseBillVO;
+import nc.vo.arap.basebill.BaseItemVO;
+import nc.vo.arap.billconfer.BCMiddleVO;
+import nc.vo.arap.billconfer.BCParamVO;
+import nc.vo.arap.billconfer.BcMapVO;
+import nc.vo.arap.billconfer.BillconferVO;
+import nc.vo.arap.pub.ArapBillTypeInfo;
+import nc.vo.arap.pub.ArapConstant;
+import nc.vo.arap.pub.BillEnumCollection;
+import nc.vo.arap.pub.IArapBilltypeInfo;
+import nc.vo.arap.pub.BillEnumCollection.BillCooperate;
+import nc.vo.arap.pub.BillEnumCollection.BillSatus;
+import nc.vo.arap.pub.BillEnumCollection.FromSystem;
+import nc.vo.arap.pub.BillEnumCollection.ObjType;
+import nc.vo.arap.sysinit.SysinitConst;
+import nc.vo.fipub.exception.ExceptionHandler;
+import nc.vo.jcom.lang.StringUtil;
+import nc.vo.ml.NCLangRes4VoTransl;
+import nc.vo.org.OrgVO;
+import nc.vo.pub.AggregatedValueObject;
+import nc.vo.pub.BeanHelper;
+import nc.vo.pub.BusinessException;
+import nc.vo.pub.BusinessRuntimeException;
+import nc.vo.pub.CircularlyAccessibleValueObject;
+import nc.vo.pub.billtype.BilltypeVO;
+import nc.vo.pub.lang.UFBoolean;
+import nc.vo.pub.lang.UFDate;
+import nc.vo.pub.lang.UFDouble;
+
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * @author liaobx at 2011-3-4
+ *
+ */
+public final class BConferUtils {
+
+	private static final String ARAPCONFERNUMFLAG = "ARAP_";
+
+	private static String getCoordContent(BaseBillVO headVO) throws BusinessException {
+		return SysInitQuery.getParaString(headVO.getPk_org(), headVO.getSyscode().intValue() == FromSystem.AR.VALUE.intValue() ? SysinitConst.AR16 : SysinitConst.AP16);
+	}
+
+	public static boolean canSave(BaseAggVO bill,boolean isdelete) throws BusinessException {
+		BaseBillVO headVO = (BaseBillVO) bill.getParentVO();
+		boolean equals = SysinitConst.SYSCODE_SAVE.equals(getCoordContent(headVO));
+		equals = isAlsoGenrat(bill, equals,isdelete);
+		return equals;
+	}
+	public static boolean canDelete(BaseBillVO headVO) throws BusinessException {
+		boolean coordflag = headVO.getCoordflag() != null ? headVO.getCoordflag().equals(Integer.valueOf(1)) : false ;
+		boolean billstatus = BillEnumCollection.BillSatus.Save.VALUE.equals(headVO.getBillstatus()) ||
+		BillEnumCollection.BillSatus.Tempeorary.VALUE.equals(headVO.getBillstatus())||
+		BillEnumCollection.BillSatus.UnComfirm.VALUE.equals(headVO.getBillstatus());
+		return coordflag && billstatus;
+	}
+
+	/**
+	 * @param headVO
+	 * @param equals
+	 * @return
+	 * @throws BusinessException
+	 */
+	private static boolean isAlsoGenrat(BaseAggVO bill, boolean equals,boolean isdelete) throws BusinessException {
+		// 根据协同号确认是否已经,被协同过
+		BaseItemVO[] items = bill.getItems();
+		if(isdelete){
+			BaseBillVO headVO = (BaseBillVO) bill.getParentVO();
+			return equals && (null == headVO.getCoordflag() || headVO.getCoordflag().intValue() == BillCooperate.NOSUER.VALUE.intValue());
+		}
+		return equals && (items == null||items.length==0?false:StringUtil.isEmpty(items[0].getConfernum()));
+	}
+
+	public static boolean canEffect(BaseAggVO bill,boolean isdelete) throws BusinessException {
+		BaseBillVO headVO = (BaseBillVO) bill.getParentVO();
+		boolean equals = SysinitConst.SYSCODE_EFFECT.equals(getCoordContent(headVO));
+		equals = isAlsoGenrat(bill, equals,isdelete);
+		return equals;
+	}
+
+	private static boolean isAlsoGenrat(BaseBillVO headVO) throws BusinessException {
+		// V61  AR17,AP19,协同单据能否再协同不再使用!
+//		if (headVO.getSyscode() == null) {
+//			throw new BusinessRuntimeException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes()
+//					.getStrByID("common", "UC000-0000814")/* @res "单据号" */
+//					+ headVO.getBillno()
+//					+ nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("2006pub_0",
+//							"02006pub-0301")/* @res "syscode 不能为空" */);
+//		}
+//
+//		boolean exp = headVO.getSyscode().intValue() == FromSystem.AR.VALUE.intValue();
+//		UFBoolean flag = SysInitQuery.getParaBoolean(headVO.getPk_org(), exp ? SysinitConst.AR17 : SysinitConst.AP19);
+//		return flag.booleanValue();
+		return false;
+	}
+
+	/** 协同生成的单据 */
+	public static boolean isCoorBill(BaseBillVO headVO) {
+		return headVO.getSrc_syscode().intValue() == FromSystem.XTDJ.VALUE.intValue();
+	}
+
+	public static boolean canRedoCoord(BaseBillVO headVO) throws BusinessException {
+		return SysInitQuery.getParaBoolean(headVO.getPk_org(), headVO.getSyscode().intValue() == FromSystem.AR.VALUE.intValue() ? SysinitConst.AR16 : SysinitConst.AP16).booleanValue();
+	}
+
+	/** 获取客商主键 */
+	public static String[] getCusSups(BaseAggVO[] bills) {
+		List<String> cusSup = new ArrayList<String>();
+		for (BaseAggVO bill : bills) {
+			BaseBillVO headVO = bill.getHeadVO();
+
+			if (ObjType.CUSTOMER.VALUE == headVO.getObjtype()) {
+				cusSup.add(headVO.getCustomer());
+			} else if (ObjType.SUPPLIER.VALUE == headVO.getObjtype()) {
+				cusSup.add(headVO.getSupplier());
+			}
+		}
+		return cusSup.toArray(new String[0]);
+	}
+
+	public void save(BaseAggVO srcbill) throws BusinessException {
+		save(srcbill,false);
+	}
+
+	public void save(BaseAggVO srcbill,boolean isupdate) throws BusinessException {
+		if (srcbill == null || srcbill.getHeadVO() == null || ArrayUtils.isEmpty(srcbill.getItems())) {
+			return;
+		}
+
+		// 是协同单据 而且 不能再协同
+		if (isCoorBill(srcbill.getHeadVO()) && !isAlsoGenrat(srcbill.getHeadVO())) {
+			return;
+		}
+
+		// 如果表体中有协同号就不能再协同了
+		if(hasConferNum(srcbill,isupdate)){
+			return ;
+		}
+		// 如果上游单据 不协同
+		// 36J3 内部转账单
+		// 5F 内部结算清
+		// 264X 报销单
+		if(isFromOtherSystem(srcbill)){
+			return ;
+		}
+		IBillConferQueryService qryservice = NCLocator.getInstance().lookup(IBillConferQueryService.class);
+		BillconferVO[] confers = qryservice.queryVOByBothTrade(srcbill.getHeadVO().getPk_tradetype(), srcbill.getHeadVO().getPk_group());
+		
+		if(ArrayUtils.isEmpty(confers)){
+			return;
+		}
+		
+		BaseAggVO conferBill = getConferVO(srcbill);
+		if(conferBill == null){
+			return;
+		}
+		BaseAggVO[] destVOs = generateItemVO(conferBill, conferBill.getItems());
+		if (ArrayUtils.isEmpty(destVOs)) {
+			return;
+		}
+
+		if(isCoorBill(srcbill.getHeadVO())){
+			BaseItemVO[] items = srcbill.getItems();
+			String topBillid = items[0].getTop_billid();
+			String topBilltype = items[0].getTop_billtype();
+			BaseAggVO[] vos = NCLocator.getInstance().lookup(ArapBillTypeInfo.getInstance(topBilltype).getBillQueryService()).findBillByPrimaryKey(new String[]{topBillid});
+			if(vos!=null && vos.length!=0){
+				if(vos[0].getHeadVO().getPk_org().equals(destVOs[0].getHeadVO().getPk_org())){
+					return;
+				}
+			}
+		}
+		
+		
+
+		befInstVal(destVOs);
+		save(destVOs);
+		saveBcMap(destVOs, srcbill.getHeadVO().getPk_billtype(), srcbill.getHeadVO().getPrimaryKey());
+	}
+
+	private BaseAggVO getConferVO(BaseAggVO srcbill) {
+		BaseItemVO[] items = srcbill.getItems();
+		List<CircularlyAccessibleValueObject> conferList = new ArrayList<CircularlyAccessibleValueObject>();
+		for (CircularlyAccessibleValueObject child : items) {
+			UFDouble money = (UFDouble) child.getAttributeValue(IBillFieldGet.MONEY_DE);
+			if (money == null || money.equals(UFDouble.ZERO_DBL)) {
+				money = (UFDouble) child.getAttributeValue(IBillFieldGet.MONEY_CR);
+			}
+			if (money != null && !money.equals(UFDouble.ZERO_DBL)) { 
+				// 只有金额不为0时,才能协同;金额为0且税额不为0,不能协同
+				conferList.add((BaseItemVO) child);
+			}
+		}
+		if(conferList.size() == 0){
+			return null;
+		}
+		BaseAggVO conferBill = (BaseAggVO) srcbill.clone();
+		conferBill.setChildrenVO(conferList.toArray(new BaseItemVO[0]));
+		return conferBill;
+	}
+
+	private boolean isFromOtherSystem(BaseAggVO srcbill) {
+		// 36J3 内部转账单
+		// 5F 内部结算清
+		// 264X 报销单
+		boolean isOtherSys =false;
+		if(srcbill == null || ArrayUtils.isEmpty(srcbill.getItems())){
+			return isOtherSys;
+		}
+
+		String topBilltype = srcbill.getItems()[0].getTop_billtype();
+		if(StringUtils.isEmpty(topBilltype)){
+			return isOtherSys;
+		}
+
+		if(topBilltype.equalsIgnoreCase("36J3") ||
+				topBilltype.equalsIgnoreCase("5F")||
+				topBilltype.startsWith("264")){
+			isOtherSys = true;
+		}
+
+		return isOtherSys;
+	}
+
+	private boolean hasConferNum(BaseAggVO srcbill, boolean isupdate) {
+		for(BaseItemVO item : srcbill.getItems()) {
+			if(StringUtils.isNotEmpty(item.getConfernum())){
+				if(!item.getConfernum().startsWith(ARAPCONFERNUMFLAG)){
+					return true;
+				}else if(!isupdate){
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * @param pk_billtype
+	 * @param headPK
+	 */
+	private void saveBcMap(AggregatedValueObject[] destVOs, String pk_billtype, String headPK) throws BusinessException {
+		for(AggregatedValueObject destVO:destVOs){
+			BcMapVO bcMapVO = new BcMapVO();
+			BaseAggVO baseAggVO = (BaseAggVO)destVO;
+			bcMapVO.setSrc_billtype(pk_billtype);
+			bcMapVO.setSrc_billid(headPK);
+			bcMapVO.setDest_billtype(baseAggVO.getItems()[0].getPk_billtype());
+			bcMapVO.setDest_billid(baseAggVO.getHeadVO().getPrimaryKey());
+			bcMapVO.setReceiver(baseAggVO.getConferReceiver());
+			bcMapVO.setMessage(baseAggVO.getConferMessageInfo());
+			NCLocator.getInstance().lookup(IBConferMapService.class).insertBcMapVO(bcMapVO);
+		}
+	}
+
+	/** 通知用户 */
+	@SuppressWarnings("unused")
+	private void notifyUsers() {
+
+	}
+
+	/** 保存 */
+	private void save(AggregatedValueObject[] destVOs) throws BusinessException {
+		new BillOperator<BaseAggVO>().insert((BaseAggVO[]) destVOs);
+	}
+
+	/**
+	 * 设置一些默认值
+	 *
+	 * @param confVo
+	 */
+	private void befInstVal(AggregatedValueObject[] destVOs) {
+		for (AggregatedValueObject vo : destVOs) {
+			BaseAggVO bill = (BaseAggVO) vo;
+			bill.getHeadVO().setCoordflag(BillCooperate.NOSUER.VALUE);
+			bill.getHeadVO().setBillstatus(BillSatus.UnComfirm.VALUE);
+			bill.getHeadVO().setSrc_syscode(FromSystem.XTDJ.VALUE);
+			UFDate billdate = bill.getHeadVO().getBilldate();
+			if (billdate == null) {
+				billdate = new UFDate();
+				bill.getHeadVO().setBusidate(billdate);
+				bill.getHeadVO().setBilldate(billdate);
+			} else {
+				bill.getHeadVO().setBusidate(billdate);
+			}
+			if (bill.getHeadVO().getBillperiod() != null && bill.getHeadVO().getBillperiod().length() == 10) {
+				bill.getHeadVO().setBillperiod(bill.getHeadVO().getBillperiod().substring(5, 7));
+			}
+			for (BaseItemVO bvo : bill.getItems()) {
+				bvo.setCoordflag(Integer.valueOf(1));
+				if (billdate == null) {
+					billdate = new UFDate();
+					bvo.setBusidate(billdate);
+					bvo.setBilldate(billdate);
+				} else {
+					bvo.setBusidate(billdate);
+				}
+
+				// 组织级别档案“部门”,“业务员“直接清空
+//				bvo.setPk_deptid(null);
+//				bvo.setPk_deptid_v(null);
+				bvo.setPk_psndoc(null);
+			}
+			ArapBillPubUtil.processMoney(vo);
+		}
+	}
+
+	enum ConferStatus {
+		/** 含有唯一单据协同 */
+		HAS_REAL_CONFER(1),
+		/** 含有通用的单据协同 sourceorg 为 '~' */
+		HAS_GENERAL_CONFER(2),
+		/** 没有单据协同 */
+		NONE_CONFER(0);
+		public final Integer VALUE;
+
+		ConferStatus(int value) {
+			VALUE = value;
+		}
+	}
+
+	private BaseAggVO[] generateItemVO(BaseAggVO srcbill, BaseItemVO[] items) throws BusinessException {
+		// 内部客商, 客户/供应商的 ID可能相同
+		Set<String> customers = new HashSet<String>();
+		Set<String> suppliers = new HashSet<String>();
+		IBillConferQueryService qryservice = NCLocator.getInstance().lookup(IBillConferQueryService.class);
+		String orgname = null;
+
+		Map<String, BCMiddleVO> map = new HashMap<String, BCMiddleVO>();
+		// 供应商客户对应表体的PK
+		Map<String, String> cusupMItemPk = new HashMap<String, String>();
+		for (BaseItemVO vo : items) {
+			BCParamVO paramVO = new BCParamVO();
+			paramVO.setBusitype(srcbill.getHeadVO().getPk_busitype());
+			paramVO.setSrcorg(vo.getPk_org());
+			paramVO.setSrcTradetype(vo.getPk_tradetype());
+
+			if (ObjType.CUSTOMER.VALUE.equals(vo.getObjtype())) {
+				paramVO.setObjType(ObjType.SUPPLIER);
+				if (!customers.contains(vo.getCustomer())) {
+					customers.add(vo.getCustomer());
+					cusupMItemPk.put(vo.getCustomer(), vo.getPrimaryKey());
+					paramVO.setSrcCustsup(vo.getCustomer());
+					map.put(vo.getPrimaryKey(), qryservice.queryBillConfer(paramVO));
+				} else {
+					String key = cusupMItemPk.get(vo.getCustomer());
+					map.put(vo.getPrimaryKey(), map.get(key));
+				}
+
+			} else if (ObjType.SUPPLIER.VALUE.equals(vo.getObjtype())) {
+				paramVO.setObjType(ObjType.CUSTOMER);
+				if (!suppliers.contains(vo.getSupplier())) {
+					suppliers.add(vo.getSupplier());
+					cusupMItemPk.put(vo.getSupplier(), vo.getPrimaryKey());
+					paramVO.setSrcCustsup(vo.getSupplier());
+					map.put(vo.getPrimaryKey(), qryservice.queryBillConfer(paramVO));
+				} else {
+					String key = cusupMItemPk.get(vo.getSupplier());
+					map.put(vo.getPrimaryKey(), map.get(key));
+				}
+			}
+		}
+		Map<String, BaseAggVO> voMap = new HashMap<String, BaseAggVO>();
+
+		// 复制聚合VO上的属性
+		Map<String, Object> billValMap = new HashMap<String, Object>();
+		Field[] declaredFields = srcbill.getClass().getDeclaredFields();
+		for (Field field : declaredFields) {
+			billValMap.put(field.getName(), BeanHelper.getProperty(srcbill, field.getName()));
+		}
+
+		BaseAggVO[] bills = new BaseAggVO[0];
+
+		// billconfersql
+		Set<String> sqls= new HashSet<String>();
+		if (map.size() > 0) {
+			String targetbill = map.values().toArray(new BCMiddleVO[] {})[0].getTargetbill();
+
+			bills = new BaseAggVO[items.length];
+			for (int i = 0; i < items.length; i++) {
+
+				BCMiddleVO bcMiddleVO = map.get(items[i].getPrimaryKey());
+				if (null == bcMiddleVO) {
+					continue;
+				}
+
+				targetbill = bcMiddleVO.getTargetbill();
+				String targetorg = bcMiddleVO.getTargetorg();
+
+				if (StringUtils.isEmpty(targetbill) || StringUtils.isEmpty(targetorg)) {
+					continue;
+				}
+
+				try {
+					BaseAggVO newInstance = srcbill.getClass().newInstance();
+					newInstance.setParentVO((CircularlyAccessibleValueObject) srcbill.getParentVO().clone());
+					// 设置聚合VO的属性
+					for (Map.Entry<String, Object> entry : billValMap.entrySet()) {
+						BeanHelper.setProperty(newInstance, entry.getKey(), billValMap.get(entry.getKey()));
+					}
+
+					newInstance.setChildrenVO(new BaseItemVO[] {(BaseItemVO) items[i].clone()});
+					bills[i] = newInstance;
+
+				} catch (Exception e) {
+					ExceptionHandler.handleException(e);
+				}
+
+				bills[i] = (BaseAggVO) PfUtilTools.runChangeData(items[i].getPk_billtype(), targetbill, bills[i]);
+				String pk_billtype = (String) bills[i].getParentVO().getAttributeValue(IBillFieldGet.PK_BILLTYPE);
+				
+				if(pk_billtype.equals(IBillFieldGet.F0) || pk_billtype.equals(IBillFieldGet.F2)){
+					bills[i].getParentVO().setAttributeValue(IBillFieldGet.CUSTOMER, bcMiddleVO.getCustsup());
+					bills[i].getParentVO().setAttributeValue(IBillFieldGet.ORDERCUBASDOC, bcMiddleVO.getCustsup());
+					bills[i].getParentVO().setAttributeValue(IBillFieldGet.SUPPLIER, null);
+				}else{
+					bills[i].getParentVO().setAttributeValue(IBillFieldGet.SUPPLIER, bcMiddleVO.getCustsup());
+					bills[i].getParentVO().setAttributeValue(IBillFieldGet.CUSTOMER, null);
+				}
+				
+				bills[i].getParentVO().setAttributeValue(IBillFieldGet.PK_ORG, targetorg);
+				bills[i].getParentVO().setAttributeValue(IBillFieldGet.SETT_ORG, targetorg);
+
+
+				String[] headClearFields = new String[] {
+						IBillFieldGet.PK_BUSITYPE,
+						IBillFieldGet.PK_ORG_V,
+						IBillFieldGet.SETT_ORG_V,
+						IBillFieldGet.PK_PCORG, 
+						IBillFieldGet.PK_PCORG_V, 
+						IBillFieldGet.CHECKELEMENT, 
+				};
+
+				for(String clear:headClearFields){
+					bills[i].getParentVO().setAttributeValue(clear,null);
+				}
+
+//				String[] bodyClearFields = new String[] { IBillFieldGet.PK_DEPTID_V, IBillFieldGet.PK_DEPTID,
+//						IBillFieldGet.PK_PCORG, IBillFieldGet.CHECKELEMENT, IBillFieldGet.PK_PSNDOC };
+				
+				String[] bodyClearFields = new String[] { IBillFieldGet.PK_PCORG, IBillFieldGet.CHECKELEMENT, IBillFieldGet.PK_PSNDOC };
+
+				for (CircularlyAccessibleValueObject item : bills[i].getChildrenVO()) {
+					item.setAttributeValue(IBillFieldGet.PK_ORG, targetorg);
+					item.setAttributeValue(IBillFieldGet.SETT_ORG, targetorg);
+					
+					if(pk_billtype.equals(IBillFieldGet.F0) || pk_billtype.equals(IBillFieldGet.F2)){
+						item.setAttributeValue(IBillFieldGet.CUSTOMER, bcMiddleVO.getCustsup());
+						item.setAttributeValue(IBillFieldGet.ORDERCUBASDOC, bcMiddleVO.getCustsup());
+						item.setAttributeValue(IBillFieldGet.SUPPLIER, null);
+					}else{
+						item.setAttributeValue(IBillFieldGet.CUSTOMER, null);
+						item.setAttributeValue(IBillFieldGet.SUPPLIER, bcMiddleVO.getCustsup());
+					}
+					
+					
+					item.setAttributeValue(IBillFieldGet.OBJTYPE, bcMiddleVO.getObjtype());
+
+
+					for(String clear:bodyClearFields){
+						item.setAttributeValue(clear,null);
+					}
+
+					if(StringUtils.isNotEmpty(bcMiddleVO.getReceiver())){
+						bills[i].setConferReceiver(bcMiddleVO.getReceiver());
+					}
+					if (voMap.containsKey(targetorg)) {
+						BaseAggVO baseAggVO = voMap.get(targetorg);
+						BaseItemVO[] childrenVO = (BaseItemVO[]) baseAggVO.getChildrenVO();
+						BaseItemVO[] childrenVO2 = new BaseItemVO[childrenVO.length + 1];
+						for (int j = 0; j < childrenVO2.length; j++) {
+							if (j == childrenVO2.length - 1) {
+								childrenVO2[j] = (BaseItemVO) item;
+							} else {
+								childrenVO2[j] = childrenVO[j];
+							}
+						}
+						bills[i].setChildrenVO(childrenVO2);
+						voMap.put(targetorg, bills[i]);
+					}
+					else {
+						voMap.put(targetorg, bills[i]);
+					}
+
+					// 自制协同时结算号全局唯一。结算号的编码生成规则:接收方组织编码(客商对应的财务组织)+发起方的单据号编码
+					// 接收方组织编码(客商对应的财务组织)集团唯一, 所以去接收方组织PK(客商对应的财务组织)
+					String billconfernum = ARAPCONFERNUMFLAG + targetorg + "_" + items[i].getBillno();
+					((BaseItemVO)item).setConfernum(billconfernum);
+
+					sqls.add(buildConferNumSql((BaseItemVO) item , srcbill
+						.getItems()[0],true) );
+				}
+			}
+
+			bills = new BaseAggVO[voMap.values().size()];
+			bills = voMap.values().toArray(bills);
+
+			for (BaseAggVO sbill : bills) {
+				BillMoneyVUtils.sumBodyToHead(sbill.getHeadVO(), sbill.getItems());
+
+				if(orgname==null){
+					orgname=NCLocator.getInstance().lookup(nc.pubitf.org.IOrgUnitPubService.class).getOrgs(new String[]{srcbill.getHeadVO().getPk_org()}, new String[]{OrgVO.PK_ORG,OrgVO.NAME})[0].getName();
+				}
+				if(StringUtils.isNotEmpty(sbill.getConferReceiver())){
+					String scomment = ((BaseItemVO)sbill.getChildrenVO()[0]).getScomment();
+					sbill.setConferMessageInfo(NCLangRes4VoTransl
+							.getNCLangRes().getStrByID(
+								"2006arappub0316_0",
+								"02006arappub0316-0011",
+								null,
+								new String[] {orgname,sbill.getHeadVO().getMoney().setScale(4, UFDouble.ROUND_HALF_UP).toString(), scomment }));
+				}
+			}
+		}
+		//协同单据财务组织期初期间启用校验
+		conferBillBillDateValidate(bills);
+		
+		// 补充默认信息,多版本,欧盟数据
+		ArapBillVOUtils.prepareDefaultInfo(bills);
+
+		if (sqls.size() > 0) {
+			DBAUtil.execBatchSql(sqls.toArray(new String[] {}));
+		}
+		
+		ArapBillPubUtil.resetDestVODoc(bills);
+		return bills;
+	}
+
+	// 生成更新来源单据协同好的sql语句
+	@SuppressWarnings("deprecation")
+	private String buildConferNumSql(BaseItemVO item, BaseItemVO srcItemVO, boolean isGenaration) {
+		if(StringUtils.isEmpty(item.getConfernum()) || StringUtils.isEmpty(srcItemVO.getTableName())) {
+			throw new IllegalArgumentException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("2006arappub0316_0","02006arappub0316-0014")/*@res "协同号 和tableName 不能为空"*/);
+		}
+		StringBuffer sql = new StringBuffer();
+		sql.append("update ").append(srcItemVO.getTableName()).append(" set ");
+		sql.append(IBillFieldGet.CONFERNUM);
+		if (isGenaration) {
+			sql.append(" = '").append(item.getConfernum()).append("' ");
+		} else {
+			sql.append(" = null ");
+		}
+		sql.append("where ").append(srcItemVO.getPKFieldName()).append(" = '");
+		sql.append(item.getTop_itemid()).append("';");
+		return sql.toString();
+	}
+
+	private String buildTopBillConferNumSql(BaseAggVO[] bills) throws BusinessException {
+		Set<String> pks = new HashSet<String>();
+		String topBilltype = null;
+		for (BaseAggVO bill : bills) {
+			for (BaseItemVO item : bill.getItems()) {
+				if (StringUtils.isNotEmpty(item.getConfernum()) && StringUtils.isNotEmpty(item.getTop_billtype())) {
+					topBilltype = item.getTop_billtype();
+					pks.add(item.getTop_itemid());
+				}
+			}
+		}
+
+		if (topBilltype == null)
+			return null;
+
+		StringBuffer sql = new StringBuffer();
+		String tableName = null;
+		String pkFieldName = null;
+		if (StringUtils.isNotEmpty(topBilltype)) {
+			BilltypeVO billType = PfDataCache.getBillType(topBilltype);
+			if (billType == null || billType.getSystemcode() == null
+					|| (!billType.getSystemcode().equalsIgnoreCase("arap")
+							&& !billType.getSystemcode().equalsIgnoreCase("ar") && !billType
+							.getSystemcode().equalsIgnoreCase("ap"))) {
+				return null;
+			}
+
+			IArapBilltypeInfo instance = ArapBillTypeInfo.getInstance(topBilltype);
+			tableName = instance == null ? null : instance.getTableNameItem();
+			pkFieldName = instance == null ? null : instance.getTablePrimaryKeyItem();
+
+		}
+		if (tableName == null || pkFieldName == null) {
+			throw new BusinessRuntimeException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("2006arappub0316_0","02006arappub0316-0015")/*@res "上游单据类型不能为空"*/);
+		}
+
+		sql.append("update ").append(tableName).append(" set ");
+		sql.append(IBillFieldGet.CONFERNUM);
+		sql.append(" = null ");
+		sql.append(" where ");
+		sql.append(SqlUtils.getInStr(pkFieldName, pks.toArray(new String[] {})));
+		return sql.toString();
+	}
+	public void reGeneratBConfer(BaseAggVO[] bills) throws BusinessException {
+		// 查询单据
+		BcMapVO[] bcmaps = NCLocator.getInstance().lookup(IBConferMapQryService.class).queryBCMapByIDAndBType(bills[0].getHeadVO().getPrimaryKey(), bills[0].getHeadVO().getPk_billtype());
+
+		if (bcmaps != null) {
+			for (BcMapVO bcmap : bcmaps) {
+				if (null != bcmap && StringUtils.isNotEmpty(bcmap.getDest_billid()) && StringUtils.isNotEmpty(bcmap.getDest_billtype())) {
+					BaseAggVO[] aggvo = NCLocator.getInstance().lookup(IArapBillPubQueryService.class).findBillByPrimaryKey(new String[] { bcmap.getDest_billid() }, new String[] { bcmap.getDest_billtype() });
+					if (!(ArrayUtils.isEmpty(aggvo))) {
+						for(BaseAggVO agg:aggvo){
+							BaseBillVO parentVO = (BaseBillVO) agg.getParentVO();
+							if(parentVO.getBillstatus().intValue()!=BillEnumCollection.BillSatus.UnComfirm.VALUE.intValue()){
+								throw new BusinessException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("2006v61020_0","02006v61020-0120")/*
+								 * @res
+								 * "协同单据已经确认,上游不能反操作!"
+								 */);
+							}
+						}
+
+						new BillDelete<BaseAggVO>().delete(aggvo);
+						NCLocator.getInstance().lookup(IBConferMapService.class).deleteByPks(new String[] { bills[0].getHeadVO().getPrimaryKey() }, bills[0].getHeadVO().getPk_billtype());
+					}
+				}
+			}
+		}
+
+		// 重新生成协同单据
+		new BConferUtils().save(bills[0], true);
+	}
+
+	public void deleteBillConfer(BaseAggVO bill) throws BusinessException {
+		IBConferMapQryService bcqrys = NCLocator.getInstance().lookup(IBConferMapQryService.class);
+		BcMapVO[] bcmaps = bcqrys.queryBCMapByIDAndBType(bill.getHeadVO().getPrimaryKey(), bill.getHeadVO().getPk_billtype());
+
+		if (bcmaps != null) {
+			for (BcMapVO bcmap : bcmaps) {
+				if (null != bcmap && StringUtils.isNotEmpty(bcmap.getDest_billid()) && StringUtils.isNotEmpty(bcmap.getDest_billtype())) {
+
+					IArapBillPubQueryService qrys = NCLocator.getInstance().lookup(IArapBillPubQueryService.class);
+					BaseAggVO[] aggvo = qrys.findBillByPrimaryKey(new String[] { bcmap.getDest_billid() }, new String[] { bcmap.getDest_billtype() });
+					deleteBill(bill, aggvo);
+
+					IBConferMapService bcms = NCLocator.getInstance().lookup(IBConferMapService.class);
+					bcms.deleteByPks(new String[] { bill.getHeadVO().getPrimaryKey() }, bill.getHeadVO().getPk_billtype());
+				}
+			}
+		}
+
+
+	}
+
+	public void clearBillConferNum(BaseAggVO[] bills) throws BusinessException {
+		// 删除来源协同的协同号
+		String buildTopBillConferNumSql = buildTopBillConferNumSql(bills);
+		if (buildTopBillConferNumSql != null) {
+			DBAUtil.execBatchSql(new String[] { buildTopBillConferNumSql });
+		}
+	}
+
+	/** [ONLY For] 协同来源单据 删除协同单据 */
+	private void deleteBill(BaseAggVO srcbill, BaseAggVO[] billconfers) throws BusinessException {
+		for (BaseAggVO billconfer : billconfers) {
+			// 已经确认
+			if (billconfer.getHeadVO().getBillstatus() != BillSatus.UnComfirm.VALUE.intValue()) {
+				ExceptionHandler.createAndThrowException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("2006v61020_0","02006v61020-0120")/*
+						 * @res
+						 * "协同单据已经确认,上游不能反操作!"
+						 */);
+				
+			}
+			// 修改与保存统一 jianglx要求 
+//			nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("2006pub_0", "02006pub-0305")/*
+//			 * @res
+//			 * "协同单据"
+//			 */+ billconfer.getHeadVO().getBillno()
+//			 + nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("2006pub_0", "02006pub-0306")/*
+//			  * @res
+//			  * "已经被确认不能被删除"
+//			  */
+			// 没有界面
+		}
+		if (!ArrayUtils.isEmpty(billconfers)) {
+			// 删除来源协同的协同号
+			Set<String> sqls = new HashSet<String>();
+			for (int i = 0; i < billconfers.length; i++) {
+				for (BaseItemVO itemVO : billconfers[i].getItems()) {
+					sqls.add(buildConferNumSql(itemVO, srcbill.getItems()[0], false));
+				}
+			}
+
+			new BillDeleteBatchBSAction().deleteVOs(billconfers);
+			String[] keys = new String[billconfers.length];
+			List<String> keys2 = new ArrayList<String>();
+			for (int i = 0; i < billconfers.length; i++) {
+				keys[i] = billconfers[i].getHeadVO().getPrimaryKey();
+				for (BaseItemVO baseitem : billconfers[i].getItems()) {
+					keys2.add(baseitem.getPrimaryKey());
+				}
+			}
+			BaseDAO baseDAO = new BaseDAO();
+			baseDAO.deleteByPKs(billconfers[0].getHeadVO().getClass(), keys);
+			baseDAO.deleteByPKs(billconfers[0].getItems()[0].getClass(), keys2.toArray(new String[0]));
+
+			if (sqls.size() > 0) {
+				DBAUtil.execBatchSql(sqls.toArray(new String[] {}));
+			}
+		}
+
+	}
+	
+	private void conferBillBillDateValidate(BaseAggVO[] bills){
+		if(bills != null && bills.length > 0){
+			if(bills[0].getParentVO().getAttributeValue(IBillFieldGet.PK_ORG) != null && !StringUtil.isEmpty((String)bills[0].getParentVO().getAttributeValue(IBillFieldGet.PK_ORG))){
+				UFDate billDate = (UFDate)bills[0].getParentVO().getAttributeValue(IBillFieldGet.BILLDATE);
+				String destOrg = (String)bills[0].getParentVO().getAttributeValue(IBillFieldGet.PK_ORG);
+				String syscode = getModuleCode((Integer)bills[0].getParentVO().getAttributeValue(IBillFieldGet.SYSCODE));
+				UFDate calendar = null;
+				try {					
+					if(bills[0].getParentVO().getAttributeValue(IBillFieldGet.ISINIT)!=null && ((UFBoolean)bills[0].getParentVO().getAttributeValue(IBillFieldGet.ISINIT)).booleanValue()){
+						calendar = ArapBillPubUtil.getArapCreateDate(syscode.equals(ArapConstant.AR_MODULE_ID),destOrg);
+					}else{
+						calendar = ArapBillPubUtil.getOrgModuleperiodDate(syscode.equals(ArapConstant.AR_MODULE_ID),destOrg);
+					}
+				} catch (nc.vo.pubapp.pattern.exception.CarrierRuntimeException e) {
+					throw new BusinessRuntimeException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("2006arappub0316_0","02006arappub0316-0067")/*@res "协同单据财务组织未设置期初期间!"*/);
+				}
+				if(null == calendar){
+					throw new BusinessRuntimeException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("2006arappub0316_0","02006arappub0316-0067")/*@res "协同单据财务组织未设置期初期间!"*/);
+				}
+				if(bills[0].getParentVO().getAttributeValue(IBillFieldGet.ISINIT)!=null && ((UFBoolean)bills[0].getParentVO().getAttributeValue(IBillFieldGet.ISINIT)).booleanValue()){//期初
+					if(billDate.after(calendar)){
+						throw new BusinessRuntimeException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("2006arappub0316_0","02006arappub0316-0068")/*@res "即将生成的协同期初单据,单据日期必须在启用日期之前!"*/);
+					}
+				}else{
+					if(!billDate.after(calendar)){
+						throw new BusinessRuntimeException(nc.vo.ml.NCLangRes4VoTransl.getNCLangRes().getStrByID("2006arappub0316_0","02006arappub0316-0069")/*@res "协同单据的单据日期必须在账套启用日期之后!"*/);
+					}
+				}
+			}
+		}
+	}
+	
+	public String getModuleCode(Integer syscode) {
+		String codes = null;
+
+		if (syscode == 0)// 应收系统
+		{
+			codes = "2006";
+		} else if (syscode == 1)// 应付系统
+		{
+			codes = "2008";
+		}
+		return codes;
+	}
+
+}