package com.imed.costaccount.service.impl; import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.imed.costaccount.common.exception.CostException; import com.imed.costaccount.constants.NumberConstant; import com.imed.costaccount.enums.ErrorCodeEnum; import com.imed.costaccount.mapper.ResponsibilityMapper; import com.imed.costaccount.model.Responsibility; import com.imed.costaccount.model.User; import com.imed.costaccount.model.dto.ResponsibilityEditDTO; import com.imed.costaccount.model.dto.ResponsibilitySaveDTO; import com.imed.costaccount.model.vo.*; import com.imed.costaccount.service.ResponsibilityService; import com.imed.costaccount.utils.BeanUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service("responsibilityService") public class ResponsibilityServiceImpl extends ServiceImpl implements ResponsibilityService { @Autowired private CostShareLevelServiceImpl costShareLevelService; /** * 责任中心列表不分页 * * @param user * @return */ @Override public List getList(User user) { // 1. 获取所有的列表然后组装 List list = this.list( new LambdaQueryWrapper() .eq(Responsibility::getHospId, user.getHospId()) ); if (CollUtil.isEmpty(list)) { return Collections.emptyList(); } // 拷贝组合 List costResponsibilityVOS = BeanUtil.convertList(list, CostResponsibilityVO.class); List parentCostResponsibility = costResponsibilityVOS.stream() .filter(i -> i.getResponsibilityLevel().equals(1)).collect(Collectors.toList()); parentCostResponsibility.forEach(i -> costResponsibilityVOS.forEach(j -> { if (j.getParentId().equals(i.getId())) { List child = i.getChild(); if (CollUtil.isEmpty(child)) { child = new ArrayList<>(); } child.add(j); i.setChild(child); } })); parentCostResponsibility.forEach(i->{ if (NumberConstant.ZERO.equals(i.getParentId())){ i.setShareLevel(null); } }); return parentCostResponsibility; } /** * 新增责任中心 * * @param responsibilitySaveDTO {@link ResponsibilitySaveDTO } * @param user */ @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void addResponsibilityCenter(ResponsibilitySaveDTO responsibilitySaveDTO, User user) { // 如果是一级分类parentId为0 Integer id = responsibilitySaveDTO.getId(); if (Objects.isNull(id)) { id = 0; } checkCode(responsibilitySaveDTO.getResponsibilityCode(), user.getHospId()); Responsibility center = BeanUtil.convertObj(responsibilitySaveDTO, Responsibility.class); center.setCreateTime(System.currentTimeMillis()).setId(null).setParentId(id).setHospId(user.getHospId()).setResponsibilityLevel(2); if (id == 0) { center.setResponsibilityLevel(1); center.setShareLevel(0); center.setShareName(""); } this.save(center); } private void checkCode(String code,Integer hospId) { // 校验责任代码唯一性 Responsibility one = this.getOne( new LambdaQueryWrapper().select(Responsibility::getId) .eq(Responsibility::getResponsibilityCode, code) .eq(Responsibility::getHospId, hospId).last("limit 1") ); if (Objects.nonNull(one)) { throw new CostException(ErrorCodeEnum.RESPONSIBILITY_CODE_EXIST); } } /** * 编辑责任中心 * * @param responsibilityEditDTO {@link ResponsibilityEditDTO} * @param user */ @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void editResponsibility(ResponsibilityEditDTO responsibilityEditDTO, User user) { Integer id = responsibilityEditDTO.getId(); Responsibility center = this.getById(id); if (Objects.isNull(center)) { throw new CostException(ErrorCodeEnum.DATA_NOT_EXIST); } // 如果修改父节点节点(只有两层的情况) if (center.getResponsibilityLevel() == 1) { this.updateParent(responsibilityEditDTO, center, user.getHospId()); return; } this.updateCurrent(responsibilityEditDTO, center,user.getHospId()); } /** * 修的是父节点 * @param dto * @param responsibility * @param hospId */ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void updateParent(ResponsibilityEditDTO dto, Responsibility responsibility, Integer hospId) { // 删除原有的父节点数据 Integer id = dto.getId(); this.removeById(id); this.checkCode(dto.getResponsibilityCode(),hospId); // 新增父节点数据 Responsibility newResponsibility = BeanUtil.convertObj(dto, Responsibility.class); newResponsibility.setId(null).setHospId(responsibility.getHospId()).setCreateTime(new Date().getTime()).setResponsibilityLevel(1); this.save(newResponsibility); // 将原来所有父节点下数据关联到新的父节点下 List list = this.list(new QueryWrapper().lambda().eq(Responsibility::getParentId, id)); list.forEach(i -> i.setParentId(newResponsibility.getId())); this.updateBatchById(list); } /** * 修改当前的节点 * * @param dto * @param responsibility * @param hospId */ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void updateCurrent(ResponsibilityEditDTO dto, Responsibility responsibility, Integer hospId) { // 删除原有的父节点数据 Integer id = dto.getId(); this.removeById(id); this.checkCode(dto.getResponsibilityCode(),hospId); // 新增父节点数据 Responsibility newResponsibility = BeanUtil.convertObj(dto, Responsibility.class); newResponsibility.setId(null).setHospId(responsibility.getHospId()).setCreateTime(new Date().getTime()).setResponsibilityLevel(1); this.save(newResponsibility); } /** * 删除责任中心 * * @param id */ @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void deleteCenter(Integer id) { Responsibility center = this.getById(id); if (Objects.isNull(center)) { throw new CostException(ErrorCodeEnum.DATA_NOT_EXIST); } Integer parentId = center.getParentId(); if (parentId == 0) { this.deleteAllSonCenter(id); return; } this.removeById(id); } /** * 删除父节点以及所有子节点责任中心 * * @param id */ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void deleteAllSonCenter(Integer id) { this.removeById(id); this.remove(new LambdaQueryWrapper().eq(Responsibility::getParentId, id)); } /** * 获取部门树列表 * * @param user * @return */ @Override public List getParentSon(User user) { // 1. 获取所有的列表然后组装 List parentList = this.list( new LambdaQueryWrapper() .eq(Responsibility::getHospId, user.getHospId()) .eq(Responsibility::getParentId, 0) ); if (CollUtil.isEmpty(parentList)) { throw new CostException(ErrorCodeEnum.DATA_NOT_EXIST); } List sonList = this.list( new LambdaQueryWrapper() .eq(Responsibility::getHospId, user.getHospId()) .ne(Responsibility::getParentId, 0) ); List list = new ArrayList<>(); // 拷贝组合 for (Responsibility parent : parentList) { CenterDepartmentVO centerDepartmentVO = new CenterDepartmentVO(); centerDepartmentVO.setResponsibilityId(parent.getId()); centerDepartmentVO.setResponsibilityName(parent.getResponsibilityName()); for (Responsibility son : sonList) { CenterDepartmentVO sonVO = new CenterDepartmentVO(); if (parent.getId().equals(son.getParentId())) { sonVO.setResponsibilityId(son.getId()); sonVO.setResponsibilityName(son.getResponsibilityName()); List child = centerDepartmentVO.getChild(); if (CollUtil.isEmpty(child)) { child = new ArrayList<>(); } child.add(sonVO); centerDepartmentVO.setChild(child); } } list.add(centerDepartmentVO); } return list; } @Override public List getParentList(User user) { List list = this.list( new LambdaQueryWrapper().select(Responsibility::getId, Responsibility::getResponsibilityName) .eq(Responsibility::getResponsibilityLevel,1) .eq(Responsibility::getHospId, user.getHospId()) ); return list.stream().map(i -> { CommonVO commonVO = new CommonVO(); commonVO.setId(i.getId()); commonVO.setName(i.getResponsibilityName()); return commonVO; }).collect(Collectors.toList()); } /** * 获取第二级别的责任中心的数据 * * @param hospId * @return */ @Override public List getLevelTwo(Integer hospId) { List responsibilities = baseMapper.selectList(new QueryWrapper().lambda() .eq(Responsibility::getHospId, hospId) .eq(Responsibility::getResponsibilityLevel, NumberConstant.TWO)); List costResponsibilityLevelVOS = BeanUtil.convertList(responsibilities, CostResponsibilityLevelVO.class); List costShareLevelServiceAll = costShareLevelService.getAll(hospId); Map> listMap = costShareLevelServiceAll.stream().collect(Collectors.groupingBy(CostShareLevelVO::getId)); // 设置责任中心的计算方式 costResponsibilityLevelVOS.forEach(i->{ Integer shareLevel = i.getShareLevel(); List costShareLevelVOList = listMap.get(shareLevel); if (!CollectionUtils.isEmpty(costShareLevelVOList)){ i.setCalcType(costShareLevelVOList.get(0).getCalcType()); } }); return costResponsibilityLevelVOS; } }