From 1f0a10ab714699acc85430b90bcb5a1eeaad1eec Mon Sep 17 00:00:00 2001
From: xiejun <xj@2023>
Date: 星期一, 17 七月 2023 10:14:45 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LifeCycleServiceImpl.java |  393 +++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 358 insertions(+), 35 deletions(-)

diff --git a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LifeCycleServiceImpl.java b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LifeCycleServiceImpl.java
index f731a5d..ace2a89 100644
--- a/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LifeCycleServiceImpl.java
+++ b/Source/UBCS/ubcs-service/ubcs-omd/src/main/java/com/vci/ubcs/omd/service/impl/LifeCycleServiceImpl.java
@@ -9,21 +9,14 @@
 import com.vci.ubcs.omd.dto.LifeCycleEdgeDTO;
 import com.vci.ubcs.omd.dto.LifeCycleLineEventDTO;
 import com.vci.ubcs.omd.dto.LifeCycleNodeDTO;
-import com.vci.ubcs.omd.entity.LifeCycleEdge;
-import com.vci.ubcs.omd.entity.LifeCycleLineEvent;
-import com.vci.ubcs.omd.entity.LifeCycleNode;
-import com.vci.ubcs.omd.entity.LifeCycleRule;
-import com.vci.ubcs.omd.mapper.LifeCycleEdgeMapper;
-import com.vci.ubcs.omd.mapper.LifeCycleLineEventMapper;
-import com.vci.ubcs.omd.mapper.LifeCycleMapper;
-import com.vci.ubcs.omd.mapper.LifeCycleNodeMapper;
+import com.vci.ubcs.omd.entity.*;
+import com.vci.ubcs.omd.mapper.*;
 import com.vci.ubcs.omd.repeater.DomainRepeater;
 import com.vci.ubcs.omd.service.IBtmTypeService;
 import com.vci.ubcs.omd.service.ILifeCycleService;
 import com.vci.ubcs.omd.service.IStatusService;
-import com.vci.ubcs.omd.vo.BtmTypeVO;
-import com.vci.ubcs.omd.vo.LifeCycleVO;
-import com.vci.ubcs.omd.vo.StatusVO;
+import com.vci.ubcs.omd.vo.*;
+import com.vci.ubcs.omd.wrapper.LifeCycleEventWrapper;
 import com.vci.ubcs.omd.wrapper.LifeCycleRuleWrapper;
 import com.vci.ubcs.starter.enumpack.NewAppConstantEnum;
 import com.vci.ubcs.starter.exception.VciBaseException;
@@ -85,6 +78,9 @@
 	@Lazy
 	private IBtmTypeService btmTypeService;
 
+	@Resource
+	private LifeCycleEventMapper eventMapper;
+
 
 	/**
 	 * 鑾峰彇鐢熷懡鍛ㄦ湡鍒楄〃
@@ -99,6 +95,30 @@
 	}
 
 	/**
+	 * 鑾峰彇鍏ㄩ儴鐨勪簨浠�
+	 *
+	 * @param conditionMap 鏌ヨ鏉′欢
+	 * @param query        鍒嗛〉
+	 * @return 浜嬩欢鐨勬樉绀哄璞�
+	 */
+	@Override
+	public IPage<LifeCycleEventVO> listEvent(Map<String, Object> conditionMap, Query query) {
+		return LifeCycleEventWrapper.build().pageVO(eventMapper.selectPage(Condition.getPage(query),Condition.getQueryWrapper(conditionMap, LifeCycleEvent.class).lambda().orderByAsc(LifeCycleEvent::getEventFullName)));
+	}
+
+	public List<LifeCycleEventVO> listEventNoPage(){
+		QueryWrapper<LifeCycleEvent> queryWrapper = new QueryWrapper();
+		List<LifeCycleEvent> lifeCycleEvents =  eventMapper.selectList(queryWrapper);
+		List<LifeCycleEventVO> vos = new ArrayList<>();
+		lifeCycleEvents.stream().forEach(lifeCycleEvent -> {
+			LifeCycleEventVO vo = new LifeCycleEventVO();
+			BeanUtil.convert(lifeCycleEvent,vo);
+			vos.add(vo);
+		});
+		return vos;
+	}
+
+	/**
 	 * 娣诲姞淇濆瓨
 	 *
 	 * @param lifeCycleDTO 鏁版嵁浼犺緭瀵硅薄
@@ -109,8 +129,8 @@
 	public LifeCycleVO addSave(LifeCycleDTO lifeCycleDTO) {
 		VciBaseUtil.alertNotNull(lifeCycleDTO,"鐢熷懡鍛ㄦ湡淇℃伅",lifeCycleDTO.getId(),"鐢熷懡鍛ㄦ湡鐨勭紪鍙�",lifeCycleDTO.getName(),"鐢熷懡鍛ㄦ湡鍚嶇О",lifeCycleDTO.getNodes(),"鐢熷懡鍛ㄦ湡鐨勮妭鐐�",lifeCycleDTO.getStartStatus(),"璧峰鐘舵��");
 		//鍏堟煡璇㈡槸鍚﹀瓨鍦�
-		QueryWrapper wrapper = new QueryWrapper(LifeCycleRule.class);
-		wrapper.eq("lower(id)",lifeCycleDTO.getId().toLowerCase(Locale.ROOT));
+		QueryWrapper<LifeCycleRule> wrapper = new QueryWrapper<>();
+		wrapper.eq("id",lifeCycleDTO.getId().toLowerCase(Locale.ROOT));
 		if(baseMapper.selectCount(wrapper)>0){
 			throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勭紪鍙蜂笉鑳介噸澶�");
 		}
@@ -132,8 +152,6 @@
 		life.setOid(VciBaseUtil.getPk());
 		String creator = AuthUtil.getUserAccount();
 		Date now = new Date();
-		life.setBtmname(BtmTypeConstant.LIFE_CYCLE);
-		life.setOwner(creator);
 		life.setCreator(creator);
 		life.setCreateTime(now);
 		life.setLastModifier(creator);
@@ -197,8 +215,6 @@
 		LifeCycleLineEvent event = org.springblade.core.tool.utils.BeanUtil.copy(eventDTO, LifeCycleLineEvent.class);
 		event.setOid(VciBaseUtil.getPk());
 		event.setPkLifeCycleEdge(edgeOid);
-		event.setBtmname(BtmTypeConstant.LIFE_CYCLE_LINE_EVENT);
-		event.setOwner(creator);
 		event.setCreator(creator);
 		event.setCreateTime(now);
 		event.setLastModifier(creator);
@@ -219,8 +235,6 @@
 		LifeCycleNode node = org.springblade.core.tool.utils.BeanUtil.copy(nodeDTO, LifeCycleNode.class);
 		node.setOid(VciBaseUtil.getPk());
 		node.setLifeCycleOid(lifeOid);
-		node.setBtmname(BtmTypeConstant.LIFE_CYCLE_NODE);
-		node.setOwner(creator);
 		node.setCreator(creator);
 		node.setCreateTime(now);
 		node.setLastModifier(creator);
@@ -239,7 +253,7 @@
 	 * @return 杩炴帴绾跨殑涓婚敭
 	 */
 	private String addLifeCycleEdge(LifeCycleEdgeDTO edgeDTO,List<String> statusList,String lifeOid,String creator,Date now){
-		VciBaseUtil.alertNotNull(edgeDTO.getSource(),"鏉ユ簮鐘舵��",edgeDTO.getTarget(),"鐩爣鐘舵��",edgeDTO.getName(),"杩炴帴绾垮悕绉�");
+		VciBaseUtil.alertNotNull(edgeDTO.getSource(),"鏉ユ簮鐘舵��",edgeDTO.getTarget(),"鐩爣鐘舵��");
 		if(!statusList.contains(edgeDTO.getSource())
 			||!statusList.contains(edgeDTO.getTarget())){
 			throw new VciBaseException("鏁版嵁閿欒锛孾" + edgeDTO.getName() + "]杩炴帴绾夸笂涓娇鐢ㄧ殑鐘舵�佹病鏈夋壘鍒�");
@@ -247,8 +261,6 @@
 		LifeCycleEdge edge = org.springblade.core.tool.utils.BeanUtil.copy(edgeDTO, LifeCycleEdge.class);
 		edge.setOid(VciBaseUtil.getPk());
 		edge.setLifeCycleOid(lifeOid);
-		edge.setBtmname(BtmTypeConstant.LIFE_CYCLE_EDGE);
-		edge.setOwner(creator);
 		edge.setCreator(creator);
 		edge.setCreateTime(now);
 		edge.setLastModifier(creator);
@@ -268,7 +280,7 @@
 	 */
 	@Override
 	@Transactional
-	public List<LifeCycleVO> batchAddSave(List<LifeCycleDTO> lifeCycleDTOs) {
+	public List<LifeCycleVO> batchAddSave(Collection<LifeCycleDTO> lifeCycleDTOs) {
 		VciBaseUtil.alertNotNull(lifeCycleDTOs,"鐢熷懡鍛ㄦ湡鐨勪俊鎭�");
 		//鍏堥泦浣撴牎楠屼竴涓�
 		if(lifeCycleDTOs.stream().anyMatch(s->!StringUtils.hasLength(s.getId()) || !StringUtils.hasLength(s.getName())
@@ -276,7 +288,7 @@
 			throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勭紪鍙凤紝鍚嶇О锛岃捣濮嬬姸鎬侊紝鍖呭惈鐨勮妭鐐逛笉鑳戒负绌�");
 		}
 		//缁熶竴鏍¢獙閲嶅
-		Map<String, List<LifeCycleDTO>> dtoMap = lifeCycleDTOs.stream().collect(Collectors.groupingBy(LifeCycleDTO::getId));
+		Map<String, List<LifeCycleDTO>> dtoMap = lifeCycleDTOs.stream().collect(Collectors.groupingBy(s->s.getId().toLowerCase(Locale.ROOT)));
 		dtoMap.forEach((id,dtos)->{
 			if(dtos.size()>1){
 				throw new VciBaseException("缂栧彿涓恒��" + id + "銆戠殑鐢熷懡鍛ㄦ湡閲嶅");
@@ -286,7 +298,7 @@
 			ids->{
 				QueryWrapper wrapper = new QueryWrapper(LifeCycleRule.class);
 				ids.stream().forEach(id->{
-					wrapper.eq("lower(id)",id.toLowerCase(Locale.ROOT));
+					wrapper.eq("lower(id)",id);
 					wrapper.or();
 				});
 				wrapper.eq("1","2");
@@ -304,24 +316,308 @@
 	}
 
 	/**
+	 * 淇敼淇濆瓨
+	 *
+	 * @param lifeCycleDTO 鏁版嵁浼犺緭瀵硅薄
+	 * @return
+	 */
+	@Override
+	public LifeCycleVO editSave(LifeCycleDTO lifeCycleDTO) {
+		VciBaseUtil.alertNotNull(lifeCycleDTO,"鐢熷懡鍛ㄦ湡淇℃伅",lifeCycleDTO.getId(),"鐢熷懡鍛ㄦ湡鐨勭紪鍙�",lifeCycleDTO.getName(),"鐢熷懡鍛ㄦ湡鍚嶇О"
+			,lifeCycleDTO.getNodes(),"鐢熷懡鍛ㄦ湡鐨勮妭鐐�",lifeCycleDTO.getStartStatus(),"璧峰鐘舵��",
+			lifeCycleDTO.getOid(),"涓婚敭");
+		LifeCycleRule rule = selectByOid(lifeCycleDTO.getOid());
+		//鏌ヨ閲嶅
+		QueryWrapper wrapper = new QueryWrapper(LifeCycleRule.class);
+
+		wrapper.eq("lower(id)",lifeCycleDTO.getId().toLowerCase(Locale.ROOT));
+		wrapper.ne("oid",lifeCycleDTO.getOid());
+		if(baseMapper.selectCount(wrapper)>0){
+			throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勭紪鍙蜂笉鑳介噸澶�");
+		}
+		editLifeCycle(lifeCycleDTO,rule);
+		return LifeCycleRuleWrapper.build().entityVO(getById(rule.getOid()));
+	}
+
+	public LifeCycleVO detail(LifeCycleDTO lifeCycleDTO){
+		QueryWrapper wrapper = Condition.getQueryWrapper(org.springblade.core.tool.utils.BeanUtil.copy(lifeCycleDTO, LifeCycleRule.class));
+		LifeCycleRule lifeCycleRule = baseMapper.selectOne(wrapper);
+		LifeCycleVO vo = LifeCycleRuleWrapper.build().entityVO(lifeCycleRule);
+		String lifeOid = lifeCycleRule.getOid();
+
+		QueryWrapper<LifeCycleNode> nodeWrapper = new QueryWrapper<>();
+		nodeWrapper.eq("life_cycle_oid",lifeOid.toLowerCase(Locale.ROOT));
+		List<LifeCycleNode> nodes = nodeMapper.selectList(nodeWrapper);
+		List<LifeCycleNodeVO> nodeVos = new ArrayList<>();
+		nodes.stream().forEach(doo->{
+			LifeCycleNodeVO vo1 = new LifeCycleNodeVO();
+			BeanUtil.convert(doo,vo1);
+			nodeVos.add(vo1);
+		});
+		vo.setNodes(nodeVos);
+
+		QueryWrapper<LifeCycleEdge> edgeWrapper = new QueryWrapper<>();
+		edgeWrapper.eq("life_cycle_oid",lifeOid.toLowerCase(Locale.ROOT));
+		List<LifeCycleEdge> edges = edgeMapper.selectList(edgeWrapper);
+		List<LifeCycleEdgeVO> edgeVos = new ArrayList<>();
+		edges.stream().forEach(doo->{
+			LifeCycleEdgeVO vo2 = new LifeCycleEdgeVO();
+			BeanUtil.convert(doo,vo2);
+			edgeVos.add(vo2);
+		});
+		vo.setEdges(edgeVos);
+
+		return vo;
+	}
+	/**
+	 * 淇敼鐢熷懡鍛ㄦ湡
+	 * @param lifeCycleDTO
+	 * @param life
+	 */
+	private void editLifeCycle(LifeCycleDTO lifeCycleDTO,LifeCycleRule life){
+		if(!lifeCycleDTO.getId().matches(RegExpConstant.LETTER)){
+			throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勭紪鍙峰彧鑳芥槸瀛楁瘝");
+		}
+		BeanUtil.convert(lifeCycleDTO,life);
+		String creator = AuthUtil.getUserAccount();
+		Date now = new Date();
+		life.setLastModifier(creator);
+		life.setLastModifyTime(now);
+		life.setTs(now);
+
+		//鍒犻櫎鐜板湪鍏ㄩ儴鐨勬暟鎹紝鐒跺悗閲嶆柊娣诲姞=
+		List<LifeCycleNode> nodeList = selectNodeByLifeOid(life.getOid());
+		List<LifeCycleEdge> edges = selectEdgeByLifeOid(life.getOid());
+		List<LifeCycleLineEvent> eventList = selectEventByEdgeOids(Optional.ofNullable(edges).orElseGet(ArrayList::new).stream().map(LifeCycleEdge::getOid).collect(Collectors.toList()));
+		if(!CollectionUtils.isEmpty(nodeList)){
+			nodeMapper.deleteBatchIds(nodeList.stream().map(LifeCycleNode::getOid).collect(Collectors.toList()));
+		}
+		if(!CollectionUtils.isEmpty(edges)){
+			edgeMapper.deleteBatchIds(edges.stream().map(LifeCycleEdge::getOid).collect(Collectors.toList()));
+		}
+		if(!CollectionUtils.isEmpty(eventList)){
+			lineEventMapper.deleteBatchIds(eventList.stream().map(LifeCycleLineEvent::getOid).collect(Collectors.toList()));
+		}
+
+		List<String> statusList = new ArrayList<>();
+		//澶勭悊鑺傜偣
+		if(!CollectionUtils.isEmpty(lifeCycleDTO.getNodes())){
+			lifeCycleDTO.getNodes().stream().forEach(nodeDTO->{
+				addLifeCycleNode(nodeDTO,life.getOid(),creator,now);
+				statusList.add(nodeDTO.getId());
+			});
+		}
+		if(!statusList.contains(life.getStartStatus())){
+			throw new VciBaseException("璧峰鐘舵�佷笉鍦ㄧ敓鍛藉懆鏈熺殑鐢诲竷涓�");
+		}
+		//鍒ゆ柇鎵�鏈夌殑鑺傜偣鍦ㄧ郴缁熼噷閮藉瓨鍦�
+		List<String> existStatusIdList = statusService.listStatusByIdCollection(statusList).stream().map(StatusVO::getId).collect(Collectors.toList());
+		String unExistStatus = statusList.stream().filter(s -> !existStatusIdList.contains(s)).collect(Collectors.joining(","));
+		if(StringUtils.hasLength(unExistStatus)){
+			throw new VciBaseException(unExistStatus + "杩欎簺鐘舵�佸湪鐘舵�佹睜閲屼笉瀛樺湪锛屼笉鑳芥坊鍔犲埌鐢熷懡鍛ㄦ湡涓�");
+		}
+		//澶勭悊杈圭晫鍜岃繛鎺ョ嚎
+		if(!CollectionUtils.isEmpty(lifeCycleDTO.getEdges())){
+			lifeCycleDTO.getEdges().stream().forEach(edgeDTO->{
+				String edgeOid = addLifeCycleEdge(edgeDTO,statusList,life.getOid(),creator,now);
+				if(!CollectionUtils.isEmpty(edgeDTO.getEvents())){
+					//鏈変簨浠�
+					edgeDTO.getEvents().stream().forEach(eventDTO->{
+						addLifeCycleLineEvent(eventDTO,edgeOid,creator,now);
+					});
+				}
+			});
+		}
+		baseMapper.updateById(life);
+
+	}
+
+	/**
+	 * 浣跨敤涓婚敭鏌ヨ
+	 * @param oid
+	 * @return
+	 */
+	private LifeCycleRule selectByOid(String oid){
+		LifeCycleRule rule = null;
+		try {
+			rule = getById(oid);
+		}catch (Throwable e){
+			throw new VciBaseException("浣跨敤涓婚敭鑾峰彇瀵硅薄鍑洪敊锛岃繖涓暟鎹彲鑳戒笉瀛樺湪锛屾垨鑰呮暟鎹噸澶嶄簡");
+		}
+		return rule;
+	}
+
+	/**
+	 * 鎵归噺淇敼淇濆瓨
+	 *
+	 * @param lifeCycleDTOs
+	 * @return
+	 */
+	@Override
+	public List<LifeCycleVO> batchEditSave(Collection<LifeCycleDTO> lifeCycleDTOs) {
+		if(CollectionUtils.isEmpty(lifeCycleDTOs)){
+			return new ArrayList<>();
+		}
+		if(lifeCycleDTOs.stream().anyMatch(s->!StringUtils.hasLength(s.getId()) || !StringUtils.hasLength(s.getName())
+			|| CollectionUtils.isEmpty(s.getNodes()) || !StringUtils.hasLength(s.getStartStatus()))){
+			throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勭紪鍙凤紝鍚嶇О锛岃捣濮嬬姸鎬侊紝鍖呭惈鐨勮妭鐐逛笉鑳戒负绌�");
+		}
+		//缁熶竴鏍¢獙閲嶅
+		Map<String, List<LifeCycleDTO>> dtoMap = lifeCycleDTOs.stream().collect(Collectors.groupingBy(s->s.getId().toLowerCase(Locale.ROOT)));
+		dtoMap.forEach((id,dtos)->{
+			if(dtos.size()>1){
+				throw new VciBaseException("缂栧彿涓恒��" + id + "銆戠殑鐢熷懡鍛ㄦ湡閲嶅");
+			}
+		});
+		VciBaseUtil.switchCollectionForOracleIn(dtoMap.keySet()).stream().forEach(
+			ids->{
+				QueryWrapper wrapper = new QueryWrapper(LifeCycleRule.class);
+				ids.stream().forEach(id->{
+					wrapper.eq("lower(id)",id);
+					wrapper.ne("oid",dtoMap.get(id).get(0).getOid());
+					wrapper.or();
+				});
+				wrapper.eq("1","2");
+				if(baseMapper.selectCount(wrapper)>0){
+					throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勭紪鍙蜂笉鑳介噸澶�");
+				}
+			}
+		);
+		List<String> oidList = lifeCycleDTOs.stream().map(LifeCycleDTO::getOid).collect(Collectors.toList());
+		List<LifeCycleRule> rules = listByIds(oidList);
+		if(!CollectionUtils.isEmpty(rules)){
+			rules.stream().forEach(life->{
+				editLifeCycle(dtoMap.get(life.getId().toLowerCase(Locale.ROOT)).get(0),life);
+			});
+		}
+		return LifeCycleRuleWrapper.build().listEntityVO(listByIds(oidList));
+	}
+
+	/**
 	 * 鍒犻櫎鐢熷懡鍛ㄦ湡
 	 *
 	 * @param lifeCycleDTO 鏁版嵁浼犺緭瀵硅薄
 	 */
 	@Override
+	@Transactional
 	public void delete(LifeCycleDTO lifeCycleDTO) {
 		VciBaseUtil.alertNotNull(lifeCycleDTO,"鏁版嵁浼犺緭瀵硅薄",lifeCycleDTO.getOid(),"涓婚敭");
-		LifeCycleRule rule = null;
-		try {
-			rule = getById(lifeCycleDTO.getOid());
-		}catch (Throwable e){
-			throw new VciBaseException("浣跨敤涓婚敭鑾峰彇瀵硅薄鍑洪敊锛岃繖涓暟鎹彲鑳戒笉瀛樺湪锛屾垨鑰呮暟鎹噸澶嶄簡");
-		}
+		LifeCycleRule rule = selectByOid(lifeCycleDTO.getOid());
 		//妫�鏌ヨ寮曠敤涓嶈兘鍒犻櫎
-		Integer count = btmTypeService.countByLifeId(lifeCycleDTO.getOid());
+		Integer count = btmTypeService.countByLifeId(lifeCycleDTO.getId());
 		if(count !=null && count>0){
-
+			throw new VciBaseException("鐢熷懡鍛ㄦ湡琚娇鐢紝涓嶈兘琚垹闄�");
 		}
+		//鎴戜滑鏌ヨ鍏ㄩ儴node鍜宔dge锛岀劧鍚庝竴璧峰垹闄�
+		List<LifeCycleNode> nodeList = selectNodeByLifeOid(rule.getOid());
+		List<LifeCycleEdge> edges = selectEdgeByLifeOid(rule.getOid());
+		List<LifeCycleLineEvent> eventList = selectEventByEdgeOids(Optional.ofNullable(edges).orElseGet(ArrayList::new).stream().map(LifeCycleEdge::getOid).collect(Collectors.toList()));
+		if(!CollectionUtils.isEmpty(nodeList)){
+			nodeMapper.deleteBatchIds(nodeList.stream().map(LifeCycleNode::getOid).collect(Collectors.toList()));
+		}
+		if(!CollectionUtils.isEmpty(edges)){
+			edgeMapper.deleteBatchIds(edges.stream().map(LifeCycleEdge::getOid).collect(Collectors.toList()));
+		}
+		if(!CollectionUtils.isEmpty(eventList)){
+			lineEventMapper.deleteBatchIds(eventList.stream().map(LifeCycleLineEvent::getOid).collect(Collectors.toList()));
+		}
+		baseMapper.deleteById(rule);
+	}
+
+	/**
+	 * 鏌ヨ閾炬帴绾�
+	 * @param lifeOid
+	 * @return
+	 */
+	private List<LifeCycleEdge> selectEdgeByLifeOid(String lifeOid){
+		 if(!StringUtils.hasLength(lifeOid)){
+			 return new ArrayList<>();
+		 }
+		LambdaQueryWrapper<LifeCycleEdge> query = new LambdaQueryWrapper<LifeCycleEdge>();
+		query.eq(LifeCycleEdge::getLifeCycleOid,lifeOid);
+		return edgeMapper.selectList(query);
+	}
+
+
+	/**
+	 * 鑾峰彇鑺傜偣鐨勪俊鎭�
+	 * @param lifeOids 鐢熷懡鍛ㄦ湡鐨勪富閿泦鍚�
+	 * @return
+	 */
+	private List<LifeCycleEdge> selectEdgeByLifeOids(Collection<String> lifeOids){
+		if(!CollectionUtils.isEmpty(lifeOids)){
+			return new ArrayList<>();
+		}
+		List<LifeCycleEdge> edgeList = new ArrayList<>();
+		VciBaseUtil.switchCollectionForOracleIn(lifeOids).stream().forEach(lOids->{
+			LambdaQueryWrapper<LifeCycleEdge> query = new LambdaQueryWrapper<LifeCycleEdge>();
+			lOids.stream().forEach(lOid->{
+				query.eq(LifeCycleEdge::getLifeCycleOid,lOid);
+				query.or();
+			});
+			query.eq(LifeCycleEdge::getLifeCycleOid,"-1");
+			edgeList.addAll(edgeMapper.selectList(query));
+		});
+		return edgeList;
+	}
+
+	/**
+	 * 鏌ヨ閾炬帴绾夸笂鐨勪簨浠�
+	 * @param edgeOids
+	 * @return
+	 */
+	private List<LifeCycleLineEvent> selectEventByEdgeOids(Collection<String> edgeOids){
+		if(CollectionUtils.isEmpty(edgeOids)){
+			return new ArrayList<>();
+		}
+		List<LifeCycleLineEvent> eventList = new ArrayList<>();
+		VciBaseUtil.switchCollectionForOracleIn(edgeOids).stream().forEach(edgeOidList->{
+			LambdaQueryWrapper<LifeCycleLineEvent> query = new LambdaQueryWrapper<LifeCycleLineEvent>();
+			edgeOidList.stream().forEach(edgeOid->{
+				query.eq(LifeCycleLineEvent::getPkLifeCycleEdge,edgeOid);
+				query.or();
+			});
+			query.eq(LifeCycleLineEvent::getPkLifeCycleEdge,"-1");
+			eventList.addAll(lineEventMapper.selectList(query));
+		});
+		return eventList;
+	}
+
+
+	/**
+	 * 鑾峰彇鑺傜偣鐨勪俊鎭�
+	 * @param lifeOid
+	 * @return
+	 */
+	private List<LifeCycleNode> selectNodeByLifeOid(String lifeOid){
+		if(!StringUtils.hasLength(lifeOid)){
+			return new ArrayList<>();
+		}
+		LambdaQueryWrapper<LifeCycleNode> query = new LambdaQueryWrapper<LifeCycleNode>();
+		query.eq(LifeCycleNode::getLifeCycleOid,lifeOid);
+		return nodeMapper.selectList(query);
+	}
+
+	/**
+	 * 鑾峰彇鑺傜偣鐨勪俊鎭�
+	 * @param lifeOids 鐢熷懡鍛ㄦ湡鐨勪富閿泦鍚�
+	 * @return
+	 */
+	private List<LifeCycleNode> selectNodeByLifeOids(Collection<String> lifeOids){
+		if(!CollectionUtils.isEmpty(lifeOids)){
+			return new ArrayList<>();
+		}
+		List<LifeCycleNode> nodeList = new ArrayList<>();
+		VciBaseUtil.switchCollectionForOracleIn(lifeOids).stream().forEach(lOids->{
+			LambdaQueryWrapper<LifeCycleNode> query = new LambdaQueryWrapper<LifeCycleNode>();
+			lOids.stream().forEach(lOid->{
+				query.eq(LifeCycleNode::getLifeCycleOid,lOid);
+				query.or();
+			});
+			query.eq(LifeCycleNode::getLifeCycleOid,"-1");
+			nodeList.addAll(nodeMapper.selectList(query));
+		});
+		return nodeList;
 	}
 
 	/**
@@ -330,8 +626,33 @@
 	 * @param lifeCycleDTOs 鏁版嵁浼犺緭瀵硅薄鍒楄〃
 	 */
 	@Override
+	@Transactional
 	public void batchDelete(List<LifeCycleDTO> lifeCycleDTOs) {
-
+		VciBaseUtil.alertNotNull(lifeCycleDTOs,"鐢熷懡鍛ㄦ湡鐨勪俊鎭�");
+		if(lifeCycleDTOs.stream().anyMatch(s->!StringUtils.hasLength(s.getOid()))){
+			throw new VciBaseException("鐢熷懡鍛ㄦ湡鐨勪富閿笉鑳戒负绌�");
+		}
+		List<String> oidList = lifeCycleDTOs.stream().map(LifeCycleDTO::getOid).collect(Collectors.toList());
+		List<LifeCycleRule> lifeList = baseMapper.selectBatchIds(oidList);
+		//鎵归噺鏌ヨ
+		String usedBtmTypeId = Optional.ofNullable(btmTypeService.selectByLifeIds(lifeList.stream().map(LifeCycleRule::getId).collect(Collectors.toList()))).orElseGet(ArrayList::new).stream().map(BtmTypeVO::getId).collect(Collectors.joining(","));
+		if(StringUtils.hasLength(usedBtmTypeId)){
+			throw new VciBaseException(usedBtmTypeId + "杩欎簺涓氬姟绫诲瀷寮曠敤浜嗙敓鍛藉懆鏈燂紝涓嶈兘鍒犻櫎");
+		}
+		List<LifeCycleNode> nodeList = selectNodeByLifeOids(oidList);
+		List<LifeCycleEdge> edgeList = selectEdgeByLifeOids(oidList);
+		if(!CollectionUtils.isEmpty(nodeList)){
+			nodeMapper.deleteBatchIds(nodeList.stream().map(LifeCycleNode::getOid).collect(Collectors.toList()));
+		}
+		if(!CollectionUtils.isEmpty(edgeList)){
+			List<String> edgeOids = edgeList.stream().map(LifeCycleEdge::getOid).collect(Collectors.toList());
+			edgeMapper.deleteBatchIds(edgeOids);
+			List<LifeCycleLineEvent> eventList = selectEventByEdgeOids(edgeOids);
+			if(!CollectionUtils.isEmpty(eventList)){
+				lineEventMapper.deleteBatchIds(eventList.stream().map(LifeCycleLineEvent::getOid).collect(Collectors.toList()));
+			}
+		}
+		baseMapper.deleteBatchIds(oidList);
 	}
 
 	/**
@@ -342,6 +663,8 @@
 	 */
 	@Override
 	public List<BtmTypeVO> listUses(LifeCycleDTO lifeCycleDTO) {
-		return null;
+		VciBaseUtil.alertNotNull(lifeCycleDTO,"鏁版嵁浼犺緭瀵硅薄",lifeCycleDTO.getOid(),"涓婚敭");
+		LifeCycleRule rule = selectByOid(lifeCycleDTO.getOid());
+		return btmTypeService.selectByLifeId(rule.getId());
 	}
 }

--
Gitblit v1.9.3