| | |
| | | package com.vci.web.service.impl; |
| | | |
| | | import com.vci.client.common.providers.ServiceProvider; |
| | | import com.vci.corba.common.PLException; |
| | | import com.vci.corba.omd.data.BusinessObject; |
| | | import com.vci.corba.omd.lcm.Bound; |
| | | import com.vci.corba.omd.lcm.LifeCycle; |
| | | import com.vci.corba.omd.lcm.TransitionVO; |
| | | import com.vci.corba.omd.lcm.TransitionVOEvent; |
| | | import com.vci.corba.omd.vrm.VersionRule; |
| | | import com.vci.dto.OsLifeCycleDTO; |
| | | import com.vci.dto.OsLifeCycleLineDTO; |
| | | import com.vci.dto.OsLifeCycleLineEventDTO; |
| | | import com.vci.dto.OsRevisionRuleDTO; |
| | | import com.vci.pagemodel.*; |
| | | import com.vci.starter.web.annotation.log.VciUnLog; |
| | | import com.vci.starter.web.exception.VciBaseException; |
| | | import com.vci.starter.web.pagemodel.BaseQueryObject; |
| | | import com.vci.starter.web.pagemodel.BaseResult; |
| | | import com.vci.starter.web.pagemodel.DataGrid; |
| | | import com.vci.starter.web.util.VciBaseUtil; |
| | | import com.vci.starter.web.util.VciDateUtil; |
| | | import com.vci.web.constant.CacheKeyConstant; |
| | | import com.vci.web.model.OsLifeCycleDO; |
| | | import com.vci.web.pageModel.*; |
| | | import com.vci.model.OsLifeCycleDO; |
| | | import com.vci.starter.web.util.WebThreadLocalUtil; |
| | | import com.vci.web.service.OsLifeCycleServiceI; |
| | | import com.vci.web.service.OsStatusServiceI; |
| | | import com.vci.web.service.WebBoServiceI; |
| | | import com.vci.web.util.Func; |
| | | import com.vci.web.util.PlatformClientUtil; |
| | | import com.vci.web.util.WebUtil; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.cache.annotation.CacheEvict; |
| | | import org.springframework.cache.annotation.Cacheable; |
| | | import org.springframework.context.annotation.Lazy; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.util.CollectionUtils; |
| | | |
| | | import javax.swing.*; |
| | | import java.io.File; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | | import static com.vci.frameworkcore.constant.FrameWorkBusLangCodeConstant.DATA_ID_NOT_EXIST; |
| | | import static com.vci.web.constant.CacheNameConstant.VCI_OBJECT_SERVICE; |
| | | import static com.vci.web.constant.WebLangCodeConstant.LIFE_CYCLE_ROUTER_NULL; |
| | | import static com.vci.web.constant.WebLangCodeConstant.LIFE_CYCLE_TRANS_ERROR; |
| | | import static com.vci.constant.FrameWorkBusLangCodeConstant.DATA_ID_NOT_EXIST; |
| | | import static com.vci.constant.WebLangCodeConstant.LIFE_CYCLE_ROUTER_NULL; |
| | | import static com.vci.constant.WebLangCodeConstant.LIFE_CYCLE_TRANS_ERROR; |
| | | |
| | | /** |
| | | * 生命周期服务 |
| | |
| | | * @throws VciBaseException 如果目标生命周期和当前生命周期状态没有连接线时抛出异常 |
| | | */ |
| | | @Override |
| | | public void transStatus(com.vci.corba.omd.data.BusinessObject bo, String targetStatus) |
| | | public void transStatus(BusinessObject bo, String targetStatus) |
| | | throws VciBaseException { |
| | | WebUtil.alertNotNull(bo,"业务数据对象",bo.lctId,"生命周期编码",bo.lcStatus,"当前生命周期状态",targetStatus,"目标生命周期状态"); |
| | | OsLifeCycleLineVO transVO = getTransVO(bo.lctId, bo.lcStatus, targetStatus); |
| | |
| | | * @throws VciBaseException 转换生命周期出错的时候抛出异常 |
| | | */ |
| | | @Override |
| | | public void transStatus(List<com.vci.corba.omd.data.BusinessObject> boList, String targetStatus) |
| | | public void transStatus(List<BusinessObject> boList, String targetStatus) |
| | | throws VciBaseException { |
| | | WebUtil.alertNotNull(boList,"业务数据对象",targetStatus,"目标对象"); |
| | | transStatus(boList.toArray(new com.vci.corba.omd.data.BusinessObject[0]), targetStatus); |
| | |
| | | * @throws VciBaseException 转换生命周期出错的时候抛出异常 |
| | | */ |
| | | @Override |
| | | public void transStatus(com.vci.corba.omd.data.BusinessObject[] bos, String targetStatus) |
| | | public void transStatus(BusinessObject[] bos, String targetStatus) |
| | | throws VciBaseException { |
| | | WebUtil.alertNotNull(bos,"业务数据对象",targetStatus,"目标对象"); |
| | | List<OsLifeCycleLineVO> transVOList = new ArrayList<>(); |
| | | List<com.vci.corba.omd.data.BusinessObject> transBOs = new ArrayList<>(); |
| | | List<BusinessObject> transBOs = new ArrayList<>(); |
| | | for(int i = 0 ; i < bos.length ; i ++){ |
| | | com.vci.corba.omd.data.BusinessObject bo = bos[i]; |
| | | BusinessObject bo = bos[i]; |
| | | WebUtil.alertNotNull(bo,"业务数据对象",bo.lctId,"生命周期编码",bo.lcStatus,"当前生命周期状态"); |
| | | OsLifeCycleLineVO transVO = getTransVO(bo.lctId, bo.lcStatus, targetStatus); |
| | | if(transVO!=null){ |
| | |
| | | } |
| | | } |
| | | if(!CollectionUtils.isEmpty(transBOs)) { |
| | | batchTransVo(transBOs.toArray(new com.vci.corba.omd.data.BusinessObject[0]), transVOList.toArray(new OsLifeCycleLineVO[0])); |
| | | batchTransVo(transBOs.toArray(new BusinessObject[0]), transVOList.toArray(new OsLifeCycleLineVO[0])); |
| | | } |
| | | } |
| | | |
| | |
| | | * @throws VciBaseException 转换生命周期出错的时候抛出异常 |
| | | */ |
| | | @Override |
| | | public void transCboStatus(List<com.vci.client.bof.ClientBusinessObject> cboList, |
| | | public void transCboStatus(List<BusinessObject> cboList, |
| | | String targetStatus) throws VciBaseException { |
| | | WebUtil.alertNotNull(cboList,"业务数据对象",targetStatus,"目标对象"); |
| | | com.vci.corba.omd.data.BusinessObject[] bos = new com.vci.corba.omd.data.BusinessObject[cboList.size()]; |
| | | BusinessObject[] bos = new BusinessObject[cboList.size()]; |
| | | for(int i = 0 ; i < cboList.size() ; i ++){ |
| | | bos[i] = cboList.get(i).getBusinessObject(); |
| | | bos[i] = cboList.get(i); |
| | | } |
| | | transStatus(bos, targetStatus); |
| | | } |
| | |
| | | lifeCyle.name = lifeCycleVO.getId(); |
| | | lifeCyle.tag = lifeCycleVO.getName(); |
| | | lifeCyle.oid = lifeCycleVO.getOid(); |
| | | lifeCyle.creator = lifeCycleVO.getCreator(); |
| | | String userId = WebThreadLocalUtil.getCurrentUserSessionInfoInThread().getUserId(); |
| | | lifeCyle.creator = Func.isBlank(lifeCycleVO.getCreator()) ? userId:lifeCycleVO.getCreator(); |
| | | lifeCyle.description = lifeCycleVO.getDescription(); |
| | | lifeCyle.modifier = lifeCycleVO.getLastModifier(); |
| | | lifeCyle.modifyTime = lifeCycleVO.getLastModifyTime() != null ? lifeCycleVO.getLastModifyTime().getTime():null; |
| | | lifeCyle.modifier = Func.isBlank(lifeCycleVO.getLastModifier()) ? userId:lifeCycleVO.getLastModifier(); |
| | | lifeCyle.modifyTime = System.currentTimeMillis(); |
| | | lifeCyle.createTime = lifeCycleVO.getCreateTime() != null ? lifeCycleVO.getCreateTime().getTime():null; |
| | | lifeCyle.startState =lifeCycleVO.getStartStatus(); |
| | | lifeCyle.ts = VciDateUtil.date2Str(lifeCycleVO.getTs(),VciDateUtil.DateTimeMillFormat); |
| | |
| | | @VciUnLog |
| | | public List<OsLifeCycleVO> selectAllLifeCycle() throws VciBaseException { |
| | | try { |
| | | // LifeCyle[] lifeCyles = platformClientUtil.getLifeCycleService().getLifeCyles(); |
| | | LifeCycle[] lifeCyles = ServiceProvider.getOMDService().getLifeCycleService().getLifeCycles(); |
| | | LifeCycle[] lifeCyles = platformClientUtil.getLifeCycleService().getLifeCycles(); |
| | | return lifeCycleDO2VOs(Arrays.stream(lifeCyles).collect(Collectors.toList())); |
| | | } catch (PLException vciError) { |
| | | if(logger.isErrorEnabled()){ |
| | | // logger.error(vciError.error_code,vciError); |
| | | logger.error(vciError.code,vciError); |
| | | } |
| | | throw WebUtil.getVciBaseException(vciError); |
| | | } |
| | |
| | | */ |
| | | @Override |
| | | @VciUnLog |
| | | @Cacheable(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_LIFE_CYCLE,unless="#result == null") |
| | | public Map<String,OsLifeCycleVO> selectAllLifeCycleMap() throws VciBaseException{ |
| | | return Optional.ofNullable(self.selectAllLifeCycle()).orElseGet(()->new ArrayList<>()).stream().collect(Collectors.toMap(s->s.getId(),t->t,(o1,o2)->o1)); |
| | | } |
| | |
| | | * 清除缓存 |
| | | */ |
| | | @Override |
| | | @CacheEvict(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_LIFE_CYCLE) |
| | | public void clearCache() { |
| | | |
| | | } |
| | |
| | | return Optional.ofNullable(life.getLines()).orElseGet(()->new ArrayList<>()).stream().filter(s->s.getSourceLifeStatus().equalsIgnoreCase(currentStatus) && s.getTargetLifeStatus().equalsIgnoreCase(targetStatus)).findFirst().orElseGet(()->null); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 跃迁业务类型的生命周期状态 |
| | | * @param obj 业务类型数据对象 |
| | |
| | | * @throws VciBaseException 跃迁出错的是会抛出异常 |
| | | */ |
| | | @Override |
| | | public void doTransVO(com.vci.corba.omd.data.BusinessObject obj,OsLifeCycleLineVO lineVO) throws VciBaseException { |
| | | public void doTransVO(BusinessObject obj,OsLifeCycleLineVO lineVO) throws VciBaseException { |
| | | if(lineVO!=null){ |
| | | try { |
| | | com.vci.corba.omd.lcm.TransitionVO transitionVO = lifeCycleLineVO2DO(lineVO); |
| | | // platformClientUtil.getBOFactoryService().transferBusinessObject(new BusinessObjectHolder(obj), transitionVO); |
| | | ServiceProvider.getBOFService().transferBusinessObject(obj, transitionVO); |
| | | TransitionVO transitionVO = lifeCycleLineVO2DO(lineVO); |
| | | platformClientUtil.getBOFService().transferBusinessObject(obj, transitionVO.destination); |
| | | } catch (PLException e) { |
| | | throw WebUtil.getVciBaseException(e); |
| | | } |
| | |
| | | * @param lineVO 连接线对象 |
| | | * @return 平台的连接线对象 |
| | | */ |
| | | private com.vci.corba.omd.lcm.TransitionVO lifeCycleLineVO2DO(OsLifeCycleLineVO lineVO){ |
| | | private TransitionVO lifeCycleLineVO2DO(OsLifeCycleLineVO lineVO){ |
| | | com.vci.corba.omd.lcm.TransitionVO transitionVO = new com.vci.corba.omd.lcm.TransitionVO(); |
| | | transitionVO.id = lineVO.getOid(); |
| | | transitionVO.source = lineVO.getSourceLifeStatus(); |
| | | transitionVO.destination = lineVO.getTargetLifeStatus(); |
| | | transitionVO.connect = lineVO.getName() == null?"":lineVO.getName(); |
| | | //加事件 |
| | | com.vci.corba.omd.lcm.TransitionVOEvent[] events; |
| | | TransitionVOEvent[] events; |
| | | if(lineVO.getEvents() == null || lineVO.getEvents().length == 0){ |
| | | events = new com.vci.corba.omd.lcm.TransitionVOEvent[0]; |
| | | events = new TransitionVOEvent[0]; |
| | | }else{ |
| | | events = new com.vci.corba.omd.lcm.TransitionVOEvent[lineVO.getEvents().length]; |
| | | events = new TransitionVOEvent[lineVO.getEvents().length]; |
| | | for (int j = 0; j < lineVO.getEvents().length; j++) { |
| | | OsLifeCycleLineEventVO eventVO = lineVO.getEvents()[j]; |
| | | com.vci.corba.omd.lcm.TransitionVOEvent event = new com.vci.corba.omd.lcm.TransitionVOEvent(); |
| | | TransitionVOEvent event = new TransitionVOEvent(); |
| | | event.id = eventVO.getOid(); |
| | | event.name = eventVO.getEventFullName(); |
| | | events[j] = event; |
| | |
| | | * @throws VciBaseException 跃迁出错的是会抛出异常 |
| | | */ |
| | | @Override |
| | | public void batchTransVo(com.vci.corba.omd.data.BusinessObject[] bos,OsLifeCycleLineVO[] vos) throws VciBaseException{ |
| | | public void batchTransVo(BusinessObject[] bos,OsLifeCycleLineVO[] vos) throws VciBaseException{ |
| | | batchTransVo(bos,vos,null); |
| | | } |
| | | |
| | |
| | | if(!CollectionUtils.isEmpty(lifeCyleList)){ |
| | | lifeCyleList.stream().forEach(lifeCyle -> { |
| | | try { |
| | | //校验生命周期是否合规 |
| | | this.checkLifeCycle(lifeCyle,true); |
| | | platformClientUtil.getLifeCycleService().addLifeCycle(lifeCyle); |
| | | } catch (PLException e) { |
| | | throw WebUtil.getVciBaseException(e); |
| | |
| | | if(!CollectionUtils.isEmpty(lifeCycleList)){ |
| | | lifeCycleList.stream().forEach(lifeCyle -> { |
| | | try { |
| | | //校验生命周期是否合规 |
| | | this.checkLifeCycle(lifeCyle,false); |
| | | platformClientUtil.getLifeCycleService().modifyLifeCycle(lifeCyle); |
| | | } catch (PLException e) { |
| | | throw WebUtil.getVciBaseException(e); |
| | |
| | | } |
| | | |
| | | /** |
| | | * 状态在生命周期中使用的勤快 |
| | | * 状态在生命周期中使用的范围 |
| | | * |
| | | * @param statusOid 状态的主键 |
| | | * @return 生命周期的信息 |
| | |
| | | } |
| | | |
| | | /** |
| | | * 新增单条生命周期 |
| | | * @param osLifeCycleVO |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean addLifeCycle(OsLifeCycleVO osLifeCycleVO) throws PLException { |
| | | VciBaseUtil.alertNotNull(osLifeCycleVO,"生命周期模板"); |
| | | LifeCycle lifeCycle = lifeCycleVO2DO(osLifeCycleVO); |
| | | //生命周期合规校验 |
| | | checkLifeCycle(lifeCycle,true); |
| | | return platformClientUtil.getLifeCycleService().addLifeCycle(lifeCycle); |
| | | } |
| | | |
| | | /** |
| | | * 修改生命周期 |
| | | * @param osLifeCycleVO |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean updateLifeCycle(OsLifeCycleVO osLifeCycleVO) throws PLException { |
| | | VciBaseUtil.alertNotNull(osLifeCycleVO,"生命周期模板"); |
| | | //查询修改的生命周期是否存在 |
| | | LifeCycle dbLifeCycle = platformClientUtil.getLifeCycleService().getLifeCycle(osLifeCycleVO.getId()); |
| | | if(Func.isEmpty(dbLifeCycle) || Func.isBlank(dbLifeCycle.oid)){ |
| | | throw new PLException("500",new String[]{"修改生命周期模板不存在!"}); |
| | | } |
| | | osLifeCycleVO.setCreator(dbLifeCycle.creator); |
| | | osLifeCycleVO.setCreateTime(new Date(dbLifeCycle.createTime)); |
| | | LifeCycle lifeCycle = lifeCycleVO2DO(osLifeCycleVO); |
| | | //检查生命周期修改是否和规 |
| | | checkLifeCycle(lifeCycle,false); |
| | | return platformClientUtil.getLifeCycleService().modifyLifeCycle(lifeCycle); |
| | | } |
| | | |
| | | /** |
| | | * 删除生命周期 |
| | | * @param lifeCycleDTOS |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean deleteLifeCycles(List<OsLifeCycleDTO> lifeCycleDTOS) throws PLException { |
| | | VciBaseUtil.alertNotNull(lifeCycleDTOS,"待删除的生命周期列表"); |
| | | //判断要删除的生命周期是否有被引用 |
| | | lifeCycleDTOS.stream().forEach(item->{ |
| | | String lifeCycleName = item.getId(); |
| | | try { |
| | | List<Map<String, String>> usedLifeCycleList = this.getUsedLifeCycleList(lifeCycleName); |
| | | if(Func.isNotEmpty(usedLifeCycleList)){ |
| | | throw new VciBaseException("该生命周期已被使用不允许删除"); |
| | | } |
| | | } catch (PLException e) { |
| | | logger.error(e.getMessage()); |
| | | e.printStackTrace(); |
| | | throw new VciBaseException(e.getMessage()); |
| | | } |
| | | }); |
| | | |
| | | //平台的deleteStatus方法必传三个参数,oid、name和ts |
| | | List<LifeCycle> lcList = new ArrayList<>(); |
| | | for(OsLifeCycleDTO lcDTO : lifeCycleDTOS){ |
| | | //oid和ts判空 |
| | | String oid = lcDTO.getOid(); |
| | | //id主要用来对缓存数据删除 |
| | | String id = lcDTO.getId(); |
| | | //后台会用ts进行数据一致性校验 |
| | | Date ts = lcDTO.getTs(); |
| | | if(Func.isBlank(oid) || Func.isBlank(id) || Func.isEmpty(ts)){ |
| | | throw new PLException("500",new String[]{"待删除的生命周期列表中主键【oid】、调整时间【ts】、状态名称【name】不能为空!"}); |
| | | } |
| | | LifeCycle vr = new LifeCycle(); |
| | | vr.oid = oid; |
| | | vr.name = id; |
| | | vr.ts = Func.format(ts,VciDateUtil.DateTimeMillFormat); |
| | | lcList.add(vr); |
| | | } |
| | | return platformClientUtil.getLifeCycleService().deleteLifeCycles(lcList.toArray(new LifeCycle[lcList.size()])); |
| | | } |
| | | |
| | | /** |
| | | * 查看生命周期的使用范围 |
| | | * @return |
| | | */ |
| | | @Override |
| | | public List<Map<String, String>> getUsedLifeCycleList(String lifeCycleName) throws PLException { |
| | | if(Func.isBlank(lifeCycleName)){ |
| | | throw new PLException("500",new String[]{"请选择要查询使用范围的生命周期模板!"}); |
| | | } |
| | | String[] btNames = platformClientUtil.getBtmService().getBTNamesByLCName(lifeCycleName); |
| | | if(Func.isEmpty(btNames)){ |
| | | return new ArrayList<>(); |
| | | } |
| | | List<Map<String,String>> btmNameMapList = new ArrayList<>(); |
| | | Arrays.stream(btNames).forEach(btName->{ |
| | | Map<String, String> itemMap = new HashMap<>(); |
| | | itemMap.put("lifeCycleName",lifeCycleName); |
| | | itemMap.put("source",btName); |
| | | btmNameMapList.add(itemMap); |
| | | }); |
| | | return btmNameMapList; |
| | | } |
| | | |
| | | /** |
| | | * 导出选中的生命周期 |
| | | * @param exportFileName 导出的文件名 |
| | | * @param lcNames 需要导出的生命周期名称 |
| | | * @param flag 控制导出的列名是否和导入模板一致 |
| | | * @return |
| | | */ |
| | | @Override |
| | | public String exportLifeCycles(String exportFileName, String lcNames, boolean flag) throws PLException { |
| | | |
| | | |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 下载生命周期导入模板 |
| | | * @param exportFileName |
| | | * @return |
| | | * @throws PLException |
| | | */ |
| | | @Override |
| | | public String downloadLifeCycleTemplate(String exportFileName) throws Exception { |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 导入生命周期 |
| | | * @param file |
| | | * @return |
| | | */ |
| | | @Override |
| | | public BaseResult importLifeCycles(File file) throws Exception { |
| | | |
| | | |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * 检查生命周期名称是否已存在 |
| | | * @param name |
| | | * @return |
| | | */ |
| | | public boolean checkLCExist(String name) { |
| | | try { |
| | | LifeCycle lc = platformClientUtil.getLifeCycleService().getLifeCycle(name); |
| | | if (lc != null && !lc.name.equals("")) { |
| | | return true; |
| | | } |
| | | } catch (PLException e) { |
| | | // TODO Auto-generated catch block |
| | | e.printStackTrace(); |
| | | logger.error(VciBaseUtil.getExceptionMessage(e)); |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | | /** |
| | | * 检查生命周期是否合规 |
| | | * @param lifeCycle |
| | | * @param isAdd 是否为新增 |
| | | * @throws PLException |
| | | */ |
| | | public void checkLifeCycle(LifeCycle lifeCycle,boolean isAdd) throws PLException { |
| | | String name = lifeCycle.name; |
| | | if (Func.isBlank(name)) { |
| | | throw new PLException("500", new String[]{"请输入生命周期名称!"}); |
| | | } |
| | | |
| | | if (!name.matches("[a-z A-Z]*")) { |
| | | throw new PLException("500", new String[]{"生命周期名称只能为英文字母!"}); |
| | | } |
| | | |
| | | if (isAdd && checkLCExist(name)) { |
| | | throw new PLException("500", new String[]{"该生命周期名称已经存在!"}); |
| | | } |
| | | |
| | | if (Func.isBlank(lifeCycle.startState)) { |
| | | throw new PLException("500", new String[]{"请选择开始状态!"}); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 生命周期的链接线 |
| | | * |
| | | * @param id 编号 |
| | |
| | | return ervo; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 批量执行跃迁操作,要求必须是同一个业务类型下的 |
| | | * @param bos 业务类型数据对象 |
| | |
| | | * @throws VciBaseException 跃迁出错的是会抛出异常 |
| | | */ |
| | | @Override |
| | | public void batchTransVo(com.vci.corba.omd.data.BusinessObject[] bos,OsLifeCycleLineVO[] lineVOs,String[] releaseStatus) throws VciBaseException{ |
| | | public void batchTransVo(BusinessObject[] bos,OsLifeCycleLineVO[] lineVOs,String[] releaseStatus) throws VciBaseException{ |
| | | if(bos!=null && lineVOs != null && lineVOs.length == bos.length){ |
| | | try { |
| | | if(releaseStatus == null){ |
| | |
| | | for(int i = 0 ; i < lineVOs.length; i ++){ |
| | | vos[i] = lifeCycleLineVO2DO(lineVOs[i]); |
| | | } |
| | | // platformClientUtil.getBOFactoryService().batchTransferBusinessObjectAndRelease( |
| | | // bos, vos, releaseStatus); |
| | | ServiceProvider.getBOFService().batchTransferBusinessObjectAndRelease( |
| | | platformClientUtil.getBOFService().batchTransferBusinessObjectAndRelease( |
| | | bos, vos, releaseStatus); |
| | | } catch (PLException e) { |
| | | throw WebUtil.getVciBaseException(e); |