CostIncomeGroupSetServiceImpl.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  1. package com.imed.costaccount.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.imed.costaccount.common.exception.CostException;
  8. import com.imed.costaccount.common.util.BeanUtil;
  9. import com.imed.costaccount.common.util.PageUtils;
  10. import com.imed.costaccount.constants.NumberConstant;
  11. import com.imed.costaccount.mapper.CostIncomeGroupSetMapper;
  12. import com.imed.costaccount.model.Accounting;
  13. import com.imed.costaccount.model.CostIncomeGroupSet;
  14. import com.imed.costaccount.model.Responsibility;
  15. import com.imed.costaccount.model.dto.CostIncomeGroupSetEditDto;
  16. import com.imed.costaccount.model.dto.CostIncomeGroupSetSaveDto;
  17. import com.imed.costaccount.model.dto.IncomeAccountDto;
  18. import com.imed.costaccount.model.vo.AccountIncomeSetVO;
  19. import com.imed.costaccount.model.vo.CostIncomeGroupSetVO;
  20. import com.imed.costaccount.service.AccountingService;
  21. import com.imed.costaccount.service.CostIncomeGroupSetService;
  22. import com.imed.costaccount.service.ResponsibilityService;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.transaction.annotation.Propagation;
  25. import org.springframework.transaction.annotation.Transactional;
  26. import org.springframework.util.CollectionUtils;
  27. import org.springframework.util.StringUtils;
  28. import java.util.*;
  29. import java.util.stream.Collectors;
  30. @Service("costIncomeGroupSetService")
  31. public class CostIncomeGroupSetServiceImpl extends ServiceImpl<CostIncomeGroupSetMapper, CostIncomeGroupSet> implements CostIncomeGroupSetService {
  32. private final ResponsibilityService responsibilityService;
  33. private final AccountingService accountingService;
  34. public CostIncomeGroupSetServiceImpl(ResponsibilityService responsibilityService, AccountingService accountingService) {
  35. this.responsibilityService = responsibilityService;
  36. this.accountingService = accountingService;
  37. }
  38. /**
  39. * 分页查询
  40. *
  41. * @param current 当前页
  42. * @param pageSize 每一页大小
  43. * @param hospId 医院Id
  44. * @return PageUtils
  45. */
  46. @Override
  47. public PageUtils queryList(Integer current, Integer pageSize, Long hospId) {
  48. Page<CostIncomeGroupSet> costIncomeGroupSetPage = new Page<>(current, pageSize);
  49. Page<CostIncomeGroupSet> pages = this.page(costIncomeGroupSetPage, new QueryWrapper<CostIncomeGroupSet>().lambda()
  50. .eq(CostIncomeGroupSet::getHospId, hospId)
  51. .orderByDesc(CostIncomeGroupSet::getCreateTime));
  52. List<CostIncomeGroupSet> records = pages.getRecords();
  53. List<Responsibility> responsibilityList = responsibilityService.list(new QueryWrapper<Responsibility>().lambda()
  54. .eq(Responsibility::getHospId, hospId));
  55. List<CostIncomeGroupSetVO> costIncomeGroupSetVOList = BeanUtil.convertList(records, CostIncomeGroupSetVO.class);
  56. if (!CollectionUtils.isEmpty(responsibilityList)) {
  57. final Map<String, String> listMap = responsibilityList.stream().collect(Collectors.toMap(Responsibility::getResponsibilityCode, Responsibility::getResponsibilityName));
  58. costIncomeGroupSetVOList.forEach(i -> {
  59. String responsibilityCode = i.getResponsibilityCodes();
  60. if (!StringUtils.isEmpty(responsibilityCode)){
  61. List<String> responsibilityCodeList = Arrays.asList(responsibilityCode.split(StrUtil.SLASH));
  62. if (CollectionUtils.isEmpty(responsibilityCodeList)) {
  63. String responsibilityName = listMap.get(responsibilityCodeList.get(responsibilityCodeList.size()-1));
  64. i.setResponsibilityName(responsibilityName);
  65. }
  66. }
  67. if (NumberConstant.ONE.equals(i.getOpenDepartmentStatus()) && NumberConstant.ONE.equals(i.getStartDepartmentStatus())){
  68. i.setAccountStatus(NumberConstant.ONE);
  69. }else {
  70. i.setAccountStatus(NumberConstant.ZERO);
  71. }
  72. });
  73. }
  74. PageUtils pageUtils = new PageUtils(pages);
  75. pageUtils.setList(costIncomeGroupSetVOList);
  76. return pageUtils;
  77. }
  78. /**
  79. * 根据Id获取对应的收入归集设置的数据
  80. *
  81. * @param id 收入归集设置的Id
  82. * @param hospId 医院的Id
  83. * @return CostIncomeGroupSetVO
  84. */
  85. @Override
  86. public CostIncomeGroupSetVO getByIncomeGroupId(Long id, Long hospId) {
  87. CostIncomeGroupSet costIncomeGroupSet = baseMapper.selectById(id);
  88. if (Objects.isNull(costIncomeGroupSet)) {
  89. return null;
  90. }
  91. CostIncomeGroupSetVO costIncomeGroupSetVO = BeanUtil.convertObj(costIncomeGroupSet, CostIncomeGroupSetVO.class);
  92. List<Responsibility> responsibilityList = responsibilityService.list(new QueryWrapper<Responsibility>().lambda()
  93. .eq(Responsibility::getHospId, hospId));
  94. if (!CollectionUtils.isEmpty(responsibilityList)) {
  95. Map<String, String> listMap = responsibilityList.stream().collect(Collectors.toMap(Responsibility::getResponsibilityCode, Responsibility::getResponsibilityName));
  96. String responsibilityCode = costIncomeGroupSetVO.getResponsibilityCodes();
  97. if (!StringUtils.isEmpty(responsibilityCode)) {
  98. List<String> asList = Arrays.asList(responsibilityCode.split(StrUtil.SLASH));
  99. if (!CollectionUtils.isEmpty(asList)){
  100. String responsibilities = listMap.get(asList.get(asList.size()-1));
  101. costIncomeGroupSetVO.setResponsibilityName(responsibilities);
  102. }
  103. }
  104. }
  105. return costIncomeGroupSetVO;
  106. }
  107. /**
  108. * 保存收入归集设置的数据
  109. *
  110. * @param costIncomeGroupSetSaveDto
  111. */
  112. @Override
  113. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  114. public void addCostIncomeGroupSet(CostIncomeGroupSetSaveDto costIncomeGroupSetSaveDto, Long hospId) {
  115. // 检验输入的数据是否符合要求
  116. checkIncomeGroupSet(costIncomeGroupSetSaveDto, hospId);
  117. CostIncomeGroupSet costIncomeGroupSet = BeanUtil.convertObj(costIncomeGroupSetSaveDto, CostIncomeGroupSet.class);
  118. costIncomeGroupSet.setCreateTime(System.currentTimeMillis());
  119. costIncomeGroupSet.setHospId(hospId);
  120. baseMapper.insert(costIncomeGroupSet);
  121. }
  122. /**
  123. * 检验输入的数据是否符合要求
  124. * @param costIncomeGroupSetSaveDto 需要保存的收入归集设置的数据
  125. * @param hospId 医院Id
  126. */
  127. private void checkIncomeGroupSet(CostIncomeGroupSetSaveDto costIncomeGroupSetSaveDto, Long hospId) {
  128. Integer sum = costIncomeGroupSetSaveDto.getOpenDepartmentProportion() + costIncomeGroupSetSaveDto.getStartDepartmentProportion();
  129. if (!NumberConstant.ONE_HUNDRED.equals(sum)) {
  130. throw new CostException(500, "输入的比例和不是100");
  131. }
  132. if (NumberConstant.TWO.equals(costIncomeGroupSetSaveDto.getOpenDepartmentStatus())
  133. && NumberConstant.TWO.equals(costIncomeGroupSetSaveDto.getStartDepartmentStatus())) {
  134. if (StringUtils.isEmpty(costIncomeGroupSetSaveDto.getResponsibilityCodes())){
  135. throw new CostException(500, "两个成本中心需要输入对应的责任中心");
  136. }else {
  137. costIncomeGroupSetSaveDto.setOpenDepartmentProportion(NumberConstant.ZERO);
  138. costIncomeGroupSetSaveDto.setStartDepartmentProportion(NumberConstant.ZERO);
  139. }
  140. }
  141. if (!StringUtils.isEmpty(costIncomeGroupSetSaveDto.getResponsibilityCodes())){
  142. if (NumberConstant.ONE.equals(costIncomeGroupSetSaveDto.getOpenDepartmentStatus()) ||
  143. NumberConstant.ONE.equals(costIncomeGroupSetSaveDto.getStartDepartmentStatus())){
  144. throw new CostException(500,"存在收益中心 不允许设置责任中心");
  145. }
  146. }
  147. // 检验原始数据里面是否存在
  148. List<CostIncomeGroupSet> costIncomeGroupSets = baseMapper.selectList(new QueryWrapper<CostIncomeGroupSet>().lambda()
  149. .eq(CostIncomeGroupSet::getHospId, hospId));
  150. List<CostIncomeGroupSet> costIncomeGroupSetList = costIncomeGroupSets.stream().filter(i ->
  151. i.getOpenDepartmentStatus().equals(costIncomeGroupSetSaveDto.getOpenDepartmentStatus()) &&
  152. i.getStartDepartmentStatus().equals(costIncomeGroupSetSaveDto.getStartDepartmentStatus())
  153. ).collect(Collectors.toList());
  154. if (!CollectionUtils.isEmpty(costIncomeGroupSetList)){
  155. throw new CostException(500,"开单与执行的对应类型已经存在");
  156. }
  157. // 如果一个是收入中心一个是成本中心 那本自动调整比例设置为0 100 如果两个收益中心的话需要按照不理 都是成本中心就是0
  158. if (!costIncomeGroupSetSaveDto.getOpenDepartmentStatus().equals(costIncomeGroupSetSaveDto.getStartDepartmentStatus())){
  159. if (NumberConstant.ONE.equals(costIncomeGroupSetSaveDto.getOpenDepartmentStatus())){
  160. costIncomeGroupSetSaveDto.setOpenDepartmentProportion(NumberConstant.ONE_HUNDRED);
  161. costIncomeGroupSetSaveDto.setStartDepartmentProportion(NumberConstant.ZERO);
  162. }else {
  163. costIncomeGroupSetSaveDto.setOpenDepartmentProportion(NumberConstant.ZERO);
  164. costIncomeGroupSetSaveDto.setStartDepartmentProportion(NumberConstant.ONE_HUNDRED);
  165. }
  166. }
  167. }
  168. /**
  169. * 修改收入归集设置的数据
  170. *
  171. * @param costIncomeGroupSetEditDto 需要修改的收入归集设置的数据
  172. * @param hospId 医院Id
  173. */
  174. @Override
  175. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  176. public void updateByIncomeGroup(CostIncomeGroupSetEditDto costIncomeGroupSetEditDto, Long hospId) {
  177. Long id = costIncomeGroupSetEditDto.getId();
  178. CostIncomeGroupSet costIncomeGroupSet = baseMapper.selectById(id);
  179. if (Objects.isNull(costIncomeGroupSet)) {
  180. throw new CostException(500, "收入归集设置数据不存在");
  181. }
  182. baseMapper.deleteById(id);
  183. CostIncomeGroupSetSaveDto costIncomeGroupSetSaveDto = BeanUtil.convertObj(costIncomeGroupSetEditDto, CostIncomeGroupSetSaveDto.class);
  184. // 检验输入的数据是否存在
  185. checkIncomeGroupSet(costIncomeGroupSetSaveDto,hospId);
  186. CostIncomeGroupSet incomeGroupSet = BeanUtil.convertObj(costIncomeGroupSetSaveDto, CostIncomeGroupSet.class);
  187. incomeGroupSet.setHospId(hospId);
  188. incomeGroupSet.setCreateTime(System.currentTimeMillis());
  189. incomeGroupSet.setResponsibilityCodes(costIncomeGroupSetSaveDto.getResponsibilityCodes());
  190. incomeGroupSet.setAccountCode(costIncomeGroupSet.getAccountCode());
  191. baseMapper.insert(incomeGroupSet);
  192. }
  193. /**
  194. * 查询当前收入归集设置里面对应的会计科目的Id集合
  195. *
  196. * @param incomeGroutSetId 收入归集设置的Id
  197. * @return List<String>
  198. */
  199. @Override
  200. public List<String> selectIsSelect(Integer incomeGroutSetId) {
  201. CostIncomeGroupSet incomeGroupSet = this.getById(incomeGroutSetId);
  202. if (Objects.isNull(incomeGroupSet)) {
  203. return Collections.emptyList();
  204. }
  205. String accountCode = incomeGroupSet.getAccountCode();
  206. if (!StringUtils.isEmpty(accountCode)){
  207. return Arrays.stream(accountCode.split(StrUtil.COMMA)).map(String::valueOf).collect(Collectors.toList());
  208. }else {
  209. return Collections.emptyList();
  210. }
  211. }
  212. /**
  213. * 设置对应的排除成本科目
  214. * @param incomeAccountDto 需要排除的会计科目数据对象
  215. */
  216. @Override
  217. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  218. public void updateAccountCode(IncomeAccountDto incomeAccountDto) {
  219. Long id = incomeAccountDto.getId();
  220. List<String> accountCodeList = Arrays.asList(incomeAccountDto.getAccountCodes());
  221. CostIncomeGroupSet incomeGroupSet = this.getById(id);
  222. if (Objects.isNull(incomeGroupSet)){
  223. throw new CostException(500,"收入归集设置不存在");
  224. }
  225. if (NumberConstant.TWO.equals(incomeGroupSet.getOpenDepartmentStatus())|| NumberConstant.TWO.equals(incomeGroupSet.getStartDepartmentStatus())){
  226. throw new CostException(500,"存在成本中心 不允许设置排除的会计科目");
  227. }
  228. if(CollUtil.isNotEmpty(accountCodeList)){
  229. String accountCodes = accountCodeList.stream().map(String::valueOf).collect(Collectors.joining(StrUtil.COMMA));
  230. incomeGroupSet.setAccountCode(accountCodes);
  231. }else{
  232. incomeGroupSet.setAccountCode(null);
  233. }
  234. baseMapper.updateById(incomeGroupSet);
  235. }
  236. /**
  237. * 所有的会计科目里面与当前收入归集设置有关联的数据
  238. *
  239. * @param id 当前收入归集设置的Id
  240. * @param hospId 当前医院的Id
  241. * @return
  242. */
  243. @Override
  244. public List<AccountIncomeSetVO> getIncomeAccountStatus(Long id, Long hospId) {
  245. CostIncomeGroupSet incomeGroupSet = this.getById(id);
  246. if (Objects.isNull(incomeGroupSet)){
  247. throw new CostException(500,"收入归集设置不存在");
  248. }
  249. String accountCode = incomeGroupSet.getAccountCode();
  250. List<AccountIncomeSetVO> accountIncomeSetVOList = null;
  251. if (StrUtil.isNotBlank(accountCode)){
  252. List<String> accountCodList = Arrays.asList(accountCode.split(StrUtil.COMMA));
  253. List<Accounting> accountingList = accountingService.list(new QueryWrapper<Accounting>().lambda()
  254. .eq(Accounting::getHospId, hospId)
  255. .in(Accounting::getAccountingCode,accountCodList));
  256. accountIncomeSetVOList = BeanUtil.convertList(accountingList, AccountIncomeSetVO.class);
  257. }
  258. return accountIncomeSetVOList;
  259. }
  260. }