ResponsibilityServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. package com.imed.costaccount.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.imed.costaccount.common.exception.CostException;
  7. import com.imed.costaccount.constants.NumberConstant;
  8. import com.imed.costaccount.enums.ErrorCodeEnum;
  9. import com.imed.costaccount.mapper.ResponsibilityMapper;
  10. import com.imed.costaccount.model.Responsibility;
  11. import com.imed.costaccount.model.User;
  12. import com.imed.costaccount.model.dto.ResponsibilityEditDTO;
  13. import com.imed.costaccount.model.dto.ResponsibilitySaveDTO;
  14. import com.imed.costaccount.model.vo.*;
  15. import com.imed.costaccount.service.ResponsibilityService;
  16. import com.imed.costaccount.utils.BeanUtil;
  17. import lombok.extern.slf4j.Slf4j;
  18. import org.springframework.stereotype.Service;
  19. import org.springframework.transaction.annotation.Propagation;
  20. import org.springframework.transaction.annotation.Transactional;
  21. import org.springframework.util.CollectionUtils;
  22. import java.util.*;
  23. import java.util.stream.Collectors;
  24. @Slf4j
  25. @Service("responsibilityService")
  26. public class ResponsibilityServiceImpl extends ServiceImpl<ResponsibilityMapper, Responsibility> implements ResponsibilityService {
  27. private final CostShareLevelServiceImpl costShareLevelService;
  28. public ResponsibilityServiceImpl(CostShareLevelServiceImpl costShareLevelService) {
  29. this.costShareLevelService = costShareLevelService;
  30. }
  31. /**
  32. * 责任中心列表不分页
  33. *
  34. * @param user
  35. * @return
  36. */
  37. @Override
  38. public List<CostResponsibilityVO> getList(User user) {
  39. // 1. 获取所有的列表然后组装
  40. List<Responsibility> list = this.list(
  41. new LambdaQueryWrapper<Responsibility>()
  42. .eq(Responsibility::getHospId, user.getHospId())
  43. );
  44. if (CollUtil.isEmpty(list)) {
  45. return Collections.emptyList();
  46. }
  47. // 拷贝组合
  48. List<CostResponsibilityVO> costResponsibilityVOS = BeanUtil.convertList(list, CostResponsibilityVO.class);
  49. List<CostResponsibilityVO> parentCostResponsibility = costResponsibilityVOS.stream()
  50. .filter(i -> i.getResponsibilityLevel().equals(1)).collect(Collectors.toList());
  51. parentCostResponsibility.forEach(i -> costResponsibilityVOS.forEach(j -> {
  52. if (j.getParentId().equals(i.getId())) {
  53. if (i.getResponsibilityLevel() == 1) {
  54. i.setShareLevel(null);
  55. }
  56. List<CostResponsibilityVO> child = i.getChild();
  57. if (CollUtil.isEmpty(child)) {
  58. child = new ArrayList<>();
  59. }
  60. child.add(j);
  61. i.setChild(child);
  62. }
  63. }));
  64. return parentCostResponsibility;
  65. }
  66. /**
  67. * 新增责任中心
  68. *
  69. * @param responsibilitySaveDTO {@link ResponsibilitySaveDTO }
  70. * @param user
  71. */
  72. @Override
  73. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  74. public void addResponsibilityCenter(ResponsibilitySaveDTO responsibilitySaveDTO, User user) {
  75. // 如果是一级分类parentId为0
  76. Integer id = responsibilitySaveDTO.getId();
  77. if (Objects.isNull(id)) {
  78. id = 0;
  79. }
  80. checkCode(responsibilitySaveDTO.getResponsibilityCode(), user.getHospId());
  81. Responsibility center = BeanUtil.convertObj(responsibilitySaveDTO, Responsibility.class);
  82. center.setCreateTime(System.currentTimeMillis()).setId(null).setParentId(id).setHospId(user.getHospId()).setResponsibilityLevel(2);
  83. if (id == 0) {
  84. center.setResponsibilityLevel(1);
  85. }
  86. // 如果是汇总中心,那么不存在分摊级别
  87. Integer isGatherCenter = responsibilitySaveDTO.getIsGatherCenter();
  88. if (isGatherCenter == 1) {
  89. center.setShareLevel(0);
  90. center.setShareName("");
  91. }
  92. // 父节点不允许为非汇总中心
  93. Responsibility byId = this.getById(id);
  94. if (Objects.nonNull(byId) && (byId.getIsGatherCenter() == 2)) {
  95. throw new CostException(500, "非汇总中心不允许添加");
  96. }
  97. this.save(center);
  98. }
  99. private void checkCode(String code, Integer hospId) {
  100. // 校验责任代码唯一性
  101. Responsibility one = this.getOne(
  102. new LambdaQueryWrapper<Responsibility>().select(Responsibility::getId)
  103. .eq(Responsibility::getResponsibilityCode, code)
  104. .eq(Responsibility::getHospId, hospId).last("limit 1")
  105. );
  106. if (Objects.nonNull(one)) {
  107. throw new CostException(ErrorCodeEnum.RESPONSIBILITY_CODE_EXIST);
  108. }
  109. }
  110. /**
  111. * 编辑责任中心
  112. *
  113. * @param responsibilityEditDTO {@link ResponsibilityEditDTO}
  114. * @param user
  115. */
  116. @Override
  117. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  118. public void editResponsibility(ResponsibilityEditDTO responsibilityEditDTO, User user) {
  119. Integer id = responsibilityEditDTO.getId();
  120. Responsibility center = this.getById(id);
  121. if (Objects.isNull(center)) {
  122. throw new CostException(ErrorCodeEnum.DATA_NOT_EXIST);
  123. }
  124. // 如果修改父节点节点(只有两层的情况)
  125. if (center.getResponsibilityLevel() == 1) {
  126. this.updateParent(responsibilityEditDTO, center, user.getHospId());
  127. return;
  128. }
  129. this.updateCurrent(responsibilityEditDTO, center, user.getHospId());
  130. }
  131. /**
  132. * 修的是父节点
  133. *
  134. * @param dto
  135. * @param responsibility
  136. * @param hospId
  137. */
  138. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  139. public void updateParent(ResponsibilityEditDTO dto, Responsibility responsibility, Integer hospId) {
  140. // 删除原有的父节点数据
  141. Integer id = dto.getId();
  142. this.removeById(id);
  143. List<Responsibility> child = this.list(new QueryWrapper<Responsibility>().lambda().eq(Responsibility::getParentId, id));
  144. // 如果修改是否汇总中心 从是 -》 否那么子节点直接删除
  145. if (responsibility.getIsGatherCenter() == 1 && dto.getIsGatherCenter() == 2) {
  146. this.removeByIds(child.stream().map(Responsibility::getId).collect(Collectors.toList()));
  147. return;
  148. }
  149. this.checkCode(dto.getResponsibilityCode(), hospId);
  150. // 新增父节点数据
  151. Responsibility newResponsibility = BeanUtil.convertObj(dto, Responsibility.class);
  152. newResponsibility.setId(null).setHospId(responsibility.getHospId()).setCreateTime(new Date().getTime()).setResponsibilityLevel(1);
  153. this.save(newResponsibility);
  154. // 将原来所有父节点下数据关联到新的父节点下
  155. child.forEach(i -> i.setParentId(newResponsibility.getId()));
  156. this.updateBatchById(child);
  157. }
  158. /**
  159. * 修改当前的节点
  160. *
  161. * @param dto
  162. * @param responsibility
  163. * @param hospId
  164. */
  165. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  166. public void updateCurrent(ResponsibilityEditDTO dto, Responsibility responsibility, Integer hospId) {
  167. // 删除原有的父节点数据
  168. Integer id = dto.getId();
  169. this.removeById(id);
  170. this.checkCode(dto.getResponsibilityCode(), hospId);
  171. Responsibility newResponsibility = BeanUtil.convertObj(dto, Responsibility.class);
  172. newResponsibility.setId(null)
  173. .setHospId(responsibility.getHospId())
  174. .setCreateTime(System.currentTimeMillis())
  175. .setParentId(dto.getParentId())
  176. .setResponsibilityLevel(2);
  177. // 暂时先这样处理
  178. if (dto.getIsGatherCenter() == 1) {
  179. newResponsibility.setShareId(null)
  180. .setShareLevel(0)
  181. .setShareName(null)
  182. .setParentId(0)
  183. .setResponsibilityLevel(1);
  184. }
  185. this.save(newResponsibility);
  186. }
  187. /**
  188. * 删除责任中心
  189. *
  190. * @param id
  191. */
  192. @Override
  193. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  194. public void deleteCenter(Integer id) {
  195. Responsibility center = this.getById(id);
  196. if (Objects.isNull(center)) {
  197. throw new CostException(ErrorCodeEnum.DATA_NOT_EXIST);
  198. }
  199. Integer parentId = center.getParentId();
  200. if (parentId == 0) {
  201. this.deleteAllSonCenter(id);
  202. return;
  203. }
  204. this.removeById(id);
  205. }
  206. /**
  207. * 删除父节点以及所有子节点责任中心
  208. *
  209. * @param id
  210. */
  211. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  212. public void deleteAllSonCenter(Integer id) {
  213. this.removeById(id);
  214. this.remove(new LambdaQueryWrapper<Responsibility>().eq(Responsibility::getParentId, id));
  215. }
  216. /**
  217. * 获取部门树列表
  218. *
  219. * @param user
  220. * @return
  221. */
  222. @Override
  223. public List<CenterDepartmentVO> getParentSon(User user) {
  224. // 1. 获取所有的列表然后组装
  225. List<Responsibility> parentList = this.list(
  226. new LambdaQueryWrapper<Responsibility>()
  227. .eq(Responsibility::getHospId, user.getHospId())
  228. .eq(Responsibility::getParentId, 0)
  229. );
  230. if (CollUtil.isEmpty(parentList)) {
  231. throw new CostException(ErrorCodeEnum.DATA_NOT_EXIST);
  232. }
  233. List<Responsibility> sonList = this.list(
  234. new LambdaQueryWrapper<Responsibility>()
  235. .eq(Responsibility::getHospId, user.getHospId())
  236. .ne(Responsibility::getParentId, 0)
  237. );
  238. List<CenterDepartmentVO> list = new ArrayList<>();
  239. // 拷贝组合
  240. for (Responsibility parent : parentList) {
  241. CenterDepartmentVO centerDepartmentVO = new CenterDepartmentVO();
  242. centerDepartmentVO.setResponsibilityId(parent.getId());
  243. centerDepartmentVO.setResponsibilityName(parent.getResponsibilityName());
  244. centerDepartmentVO.setIsParent(true);
  245. for (Responsibility son : sonList) {
  246. CenterDepartmentVO sonVO = new CenterDepartmentVO();
  247. if (parent.getId().equals(son.getParentId())) {
  248. sonVO.setResponsibilityId(son.getId());
  249. sonVO.setResponsibilityName(son.getResponsibilityName());
  250. sonVO.setIsParent(false);
  251. List<CenterDepartmentVO> child = centerDepartmentVO.getChild();
  252. if (CollUtil.isEmpty(child)) {
  253. child = new ArrayList<>();
  254. }
  255. child.add(sonVO);
  256. centerDepartmentVO.setChild(child);
  257. }
  258. }
  259. list.add(centerDepartmentVO);
  260. }
  261. return list;
  262. }
  263. @Override
  264. public List<CommonVO> getParentList(User user) {
  265. List<Responsibility> list = this.list(
  266. new LambdaQueryWrapper<Responsibility>().select(Responsibility::getId, Responsibility::getResponsibilityName)
  267. .eq(Responsibility::getResponsibilityLevel, 1)
  268. .eq(Responsibility::getHospId, user.getHospId())
  269. );
  270. return list.stream().map(i -> {
  271. CommonVO commonVO = new CommonVO();
  272. commonVO.setId(i.getId());
  273. commonVO.setName(i.getResponsibilityName());
  274. return commonVO;
  275. }).collect(Collectors.toList());
  276. }
  277. /**
  278. * 获取可不是汇总中心列表
  279. *
  280. * @param hospId
  281. * @return
  282. */
  283. @Override
  284. public List<CostResponsibilityLevelVO> getLevelTwo(Integer hospId) {
  285. List<Responsibility> responsibilities = baseMapper.selectList(new QueryWrapper<Responsibility>().lambda()
  286. .eq(Responsibility::getHospId, hospId)
  287. .eq(Responsibility::getIsGatherCenter, NumberConstant.TWO));
  288. List<CostResponsibilityLevelVO> costResponsibilityLevelVOS = BeanUtil.convertList(responsibilities, CostResponsibilityLevelVO.class);
  289. List<CostShareLevelVO> costShareLevelServiceAll = costShareLevelService.getAll(hospId);
  290. Map<Integer, List<CostShareLevelVO>> listMap = costShareLevelServiceAll.stream().collect(Collectors.groupingBy(CostShareLevelVO::getId));
  291. // 设置责任中心的计算方式
  292. costResponsibilityLevelVOS.forEach(i -> {
  293. i.setResponsibilityId(i.getId());
  294. Integer shareLevel = i.getShareLevel();
  295. List<CostShareLevelVO> costShareLevelVOList = listMap.get(shareLevel);
  296. if (!CollectionUtils.isEmpty(costShareLevelVOList)) {
  297. i.setCalcType(costShareLevelVOList.get(0).getCalcType());
  298. }
  299. });
  300. return costResponsibilityLevelVOS;
  301. }
  302. }