CostAccountShareServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. package com.imed.costaccount.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  4. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  5. import com.imed.costaccount.common.exception.CostException;
  6. import com.imed.costaccount.common.util.JsonUtil;
  7. import com.imed.costaccount.common.util.PageUtils;
  8. import com.imed.costaccount.constants.NumberConstant;
  9. import com.imed.costaccount.mapper.CostAccountShareMapper;
  10. import com.imed.costaccount.model.*;
  11. import com.imed.costaccount.model.dto.CostAccountShareEditDto;
  12. import com.imed.costaccount.model.dto.CostAccountShareSaveDto;
  13. import com.imed.costaccount.model.dto.ShareParamEditDto;
  14. import com.imed.costaccount.model.vo.CostAccountShareVO;
  15. import com.imed.costaccount.model.vo.CostShareParamVO;
  16. import com.imed.costaccount.model.vo.ShareParamProportionVO;
  17. import com.imed.costaccount.service.CostAccountShareService;
  18. import com.imed.costaccount.utils.BeanUtil;
  19. import org.apache.shiro.SecurityUtils;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.transaction.annotation.Propagation;
  23. import org.springframework.transaction.annotation.Transactional;
  24. import org.springframework.util.CollectionUtils;
  25. import org.springframework.util.StringUtils;
  26. import java.util.HashMap;
  27. import java.util.List;
  28. import java.util.Map;
  29. import java.util.Objects;
  30. import java.util.concurrent.atomic.AtomicReference;
  31. import java.util.stream.Collectors;
  32. @Service("costAccountShareService")
  33. public class CostAccountShareServiceImpl extends ServiceImpl<CostAccountShareMapper, CostAccountShare> implements CostAccountShareService {
  34. @Autowired
  35. private ResponsibilityServiceImpl responsibilityService;
  36. @Autowired
  37. private AccountingServiceImpl accountingService;
  38. @Autowired
  39. private CostShareLevelServiceImpl costShareLevelService;
  40. @Autowired
  41. private CostShareParamServiceImpl costShareParamService;
  42. /**
  43. * 分页查询责任中心成本对照相关数据
  44. *
  45. * @param page
  46. * @param pageSize
  47. * @param name
  48. * @return
  49. */
  50. @Override
  51. public PageUtils queryList(Integer page, Integer pageSize, String name, Integer hospId) {
  52. Page<CostAccountShare> costAccountSharePage = new Page<>(page, pageSize);
  53. Page<CostAccountShare> pages = this.page(costAccountSharePage, new QueryWrapper<CostAccountShare>().lambda()
  54. .eq(!StringUtils.isEmpty(hospId), CostAccountShare::getHospId, hospId)
  55. .like(!StringUtils.isEmpty(name), CostAccountShare::getResponsibilityName, name)
  56. .orderByAsc(CostAccountShare::getShareLevel));
  57. List<CostAccountShare> costAccountShareList = pages.getRecords();
  58. List<CostAccountShareVO> costAccountShareVOList = BeanUtil.convertList(costAccountShareList, CostAccountShareVO.class);
  59. PageUtils pageUtils = new PageUtils(pages);
  60. pageUtils.setList(costAccountShareVOList);
  61. return pageUtils;
  62. }
  63. /**
  64. * 保存责任中心成本对照表
  65. *
  66. * @param costAccountShareSaveDto
  67. */
  68. @Override
  69. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  70. public void addCostAccountShare(CostAccountShareSaveDto costAccountShareSaveDto) {
  71. User user = (User) SecurityUtils.getSubject().getPrincipal();
  72. Integer hospId = user.getHospId();
  73. // 检验输入的数据的合理性
  74. checkAccountShare(costAccountShareSaveDto, hospId);
  75. CostAccountShare costAccountShareRequest = BeanUtil.convertObj(costAccountShareSaveDto, CostAccountShare.class);
  76. costAccountShareRequest.setHospId(hospId);
  77. costAccountShareRequest.setCreateTime(System.currentTimeMillis());
  78. baseMapper.insert(costAccountShareRequest);
  79. }
  80. /**
  81. * 检验输入数据的合理性
  82. * @param costAccountShareSaveDto
  83. * @param hospId
  84. */
  85. private void checkAccountShare(CostAccountShareSaveDto costAccountShareSaveDto, Integer hospId) {
  86. Integer responsibilityId = costAccountShareSaveDto.getResponsibilityId();
  87. Responsibility responsibility = responsibilityService.getOne(new QueryWrapper<Responsibility>().lambda().eq(Responsibility::getHospId,hospId).eq(Responsibility::getId, responsibilityId));
  88. if (Objects.isNull(responsibility)){
  89. throw new CostException(500,"输入的责任不存在");
  90. }
  91. if (costAccountShareSaveDto.getAccountingId() > 0){
  92. // 如果输入成本科目的情况下
  93. Accounting accounting = accountingService.getOne(new QueryWrapper<Accounting>().lambda().eq(Accounting::getHospId, hospId).eq(Accounting::getId, costAccountShareSaveDto.getAccountingId()));
  94. if (Objects.isNull(accounting)){
  95. throw new CostException(500,"输入的成本科目不存在");
  96. }
  97. }
  98. // 检验输入的责任中心与匹配的成本科目是否存在
  99. List<CostAccountShare> costAccountShareList = baseMapper.selectList(new QueryWrapper<CostAccountShare>().lambda().eq(CostAccountShare::getHospId,hospId));
  100. Map<String, List<CostAccountShare>> costAccountMap = costAccountShareList.stream().collect(Collectors.groupingBy(CostAccountShare::getResponsibilityCode));
  101. List<CostAccountShare> list = costAccountMap.get(costAccountShareSaveDto.getResponsibilityCode());
  102. if (!CollectionUtils.isEmpty(list)){
  103. String accountingCode = list.get(0).getAccountingCode();
  104. if (accountingCode.equals(costAccountShareSaveDto.getAccountingCode())){
  105. throw new CostException(500,"输入的责任中心对应的成本科目已存在");
  106. }
  107. }
  108. // 检验输入的这个责任中心是否允许输入成本科目
  109. Integer shareLevel = responsibility.getShareLevel();
  110. CostShareLevel costShareLevel = costShareLevelService.getOne(new QueryWrapper<CostShareLevel>().lambda()
  111. .eq(CostShareLevel::getHospId, hospId).eq(CostShareLevel::getId, shareLevel));
  112. if (Objects.nonNull(costShareLevel)){
  113. if (costAccountShareSaveDto.getAccountingId()>0 && NumberConstant.ZERO.equals(costShareLevel.getCalcType())){
  114. throw new CostException(500,"合并计算不允许选择成本科目");
  115. }
  116. }else {
  117. throw new CostException(500,"对不起该责任中心没有对应分摊层级");
  118. }
  119. }
  120. /**
  121. * 修改成本中心责任对照表
  122. *
  123. * @param costAccountShareEditDto
  124. */
  125. @Override
  126. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  127. public void updateByCostAccountShare(CostAccountShareEditDto costAccountShareEditDto) {
  128. User user = (User) SecurityUtils.getSubject().getPrincipal();
  129. Integer hospId = user.getHospId();
  130. Integer id = costAccountShareEditDto.getId();
  131. CostAccountShare costAccountShare = baseMapper.selectById(id);
  132. if (Objects.isNull(costAccountShare)){
  133. throw new CostException(500,"责任中心成本数据不存在");
  134. }
  135. baseMapper.deleteById(id);
  136. // 新增责任中心成本对照数据
  137. CostAccountShareSaveDto costAccountShareSaveDto = BeanUtil.convertObj(costAccountShareEditDto, CostAccountShareSaveDto.class);
  138. // 检验输入的数据是否符合规则
  139. checkAccountShare(costAccountShareSaveDto,hospId);
  140. CostAccountShare costAccountShareRequest = BeanUtil.convertObj(costAccountShareEditDto, CostAccountShare.class);
  141. costAccountShareRequest.setId(null);
  142. costAccountShareRequest.setHospId(hospId);
  143. costAccountShareRequest.setParamList(costAccountShare.getParamList());
  144. costAccountShareRequest.setCreateTime(System.currentTimeMillis());
  145. baseMapper.insert(costAccountShareRequest);
  146. }
  147. /**
  148. * 修改成本分摊参数的设置
  149. *
  150. * @param shareParamEditDto
  151. */
  152. @Override
  153. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  154. public void updateShareParam(ShareParamEditDto shareParamEditDto) {
  155. User user = (User) SecurityUtils.getSubject().getPrincipal();
  156. Integer hospId = user.getHospId();
  157. Integer id = shareParamEditDto.getId();
  158. CostAccountShare costAccountShare = baseMapper.selectOne(new QueryWrapper<CostAccountShare>().lambda()
  159. .eq(CostAccountShare::getHospId, hospId)
  160. .eq(CostAccountShare::getId, id));
  161. if (Objects.isNull(costAccountShare)){
  162. throw new CostException(500,"责任中心成本数据不存在");
  163. }
  164. List<ShareParamProportionVO> shareParamProportionVOList = shareParamEditDto.getShareParamProportionVOList();
  165. // 检验输入的成本分摊参数是否存在
  166. List<CostShareParamVO> costShareParamServiceAll = costShareParamService.getAll(hospId);
  167. Map<Integer, List<CostShareParamVO>> listMap = costShareParamServiceAll.stream().collect(Collectors.groupingBy(CostShareParamVO::getId));
  168. shareParamProportionVOList.forEach(i->{
  169. if (CollectionUtils.isEmpty(listMap.get(i.getId()))){
  170. throw new CostException(500,"分摊名称:"+i.getShareParamName()+"未找到");
  171. }
  172. });
  173. // 检验输入的数据的和是否是100
  174. AtomicReference<Integer> sum= new AtomicReference<>(0);
  175. shareParamProportionVOList.forEach(i->{
  176. sum.updateAndGet(v -> v + i.getShareParamPopout());
  177. });
  178. int max = Integer.parseInt(sum.toString());
  179. if (!NumberConstant.ONE_HUNDRED.equals(max)){
  180. throw new CostException(500,"分摊比例的和不是100");
  181. }
  182. // 判断添加的分摊是否存在一样的
  183. HashMap<Integer, ShareParamProportionVO> hashMap = new HashMap<>();
  184. shareParamProportionVOList.forEach(i->{
  185. Integer paramId = i.getId();
  186. if (hashMap.containsKey(paramId)){
  187. throw new CostException(500,"不可以添加相同的分摊参数");
  188. }
  189. hashMap.put(paramId,i);
  190. });
  191. // TODO 暂时还考虑不到如何筛选选中的
  192. String paramList = JsonUtil.toJSONString(shareParamProportionVOList);
  193. costAccountShare.setParamList(paramList);
  194. baseMapper.updateById(costAccountShare);
  195. }
  196. /**
  197. * 获取责任中心成本表的分摊参数的集合
  198. *
  199. * @param id
  200. * @param hospId
  201. * @return
  202. */
  203. @Override
  204. public List<ShareParamProportionVO> selectShareParamById(Integer id, Integer hospId) {
  205. CostAccountShare costAccountShare = baseMapper.selectOne(new QueryWrapper<CostAccountShare>().lambda()
  206. .eq(CostAccountShare::getHospId, hospId).eq(CostAccountShare::getId, id));
  207. if (Objects.isNull(costAccountShare)){
  208. throw new CostException(500,"责任中心成本不存在");
  209. }
  210. String paramList = costAccountShare.getParamList();
  211. return JsonUtil.toList(paramList, ShareParamProportionVO.class);
  212. }
  213. }