IncomeCollectionServiceImpl.java 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package com.imed.costaccount.service.impl;
  2. import cn.hutool.core.util.StrUtil;
  3. import cn.hutool.extra.template.TemplateUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.imed.costaccount.common.constants.Constant;
  7. import com.imed.costaccount.common.exception.CostException;
  8. import com.imed.costaccount.common.util.PageUtils;
  9. import com.imed.costaccount.mapper.CostIncomeGroupMapper;
  10. import com.imed.costaccount.model.CostIncomeGroup;
  11. import com.imed.costaccount.model.vo.CollectionVO;
  12. import lombok.extern.slf4j.Slf4j;
  13. import org.springframework.stereotype.Service;
  14. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  15. import com.imed.costaccount.mapper.IncomeCollectionMapper;
  16. import com.imed.costaccount.model.IncomeCollection;
  17. import com.imed.costaccount.service.IncomeCollectionService;
  18. import org.springframework.transaction.annotation.Propagation;
  19. import org.springframework.transaction.annotation.Transactional;
  20. import java.util.*;
  21. import java.util.stream.Collectors;
  22. import static com.imed.costaccount.common.constants.Constant.LIMIT;
  23. @Slf4j
  24. @Service("incomeCollectionService")
  25. public class IncomeCollectionServiceImpl
  26. extends ServiceImpl<IncomeCollectionMapper, IncomeCollection>
  27. implements IncomeCollectionService {
  28. private final CostIncomeGroupMapper incomeGroupMapper;
  29. public IncomeCollectionServiceImpl(CostIncomeGroupMapper incomeGroupMapper) {
  30. this.incomeGroupMapper = incomeGroupMapper;
  31. }
  32. /**
  33. * 获取收入归集分页列表
  34. *
  35. * @param current 当前页
  36. * @param pageSize 页码数据大小
  37. * @param date 日期 yyyy-MM-dd
  38. * @param hospId 医院id
  39. * @return {@link PageUtils} 分页对象
  40. */
  41. @Override
  42. public PageUtils getCollections(Integer current, Integer pageSize, String date, Long hospId) {
  43. current = current - 1;
  44. Integer startIndex = current * pageSize;
  45. List<CollectionVO> list = incomeGroupMapper.getCollections(startIndex, pageSize, date, hospId);
  46. int count = incomeGroupMapper.getCollectionCount(date, hospId);
  47. // 设置是否归集字段
  48. list.forEach(i -> {
  49. i.setIsCollection(true);
  50. IncomeCollection one = this.getOne(
  51. new LambdaQueryWrapper<IncomeCollection>().select(IncomeCollection::getId)
  52. .eq(IncomeCollection::getYear, i.getYear())
  53. .eq(IncomeCollection::getMonth,i.getMonth())
  54. .last(LIMIT)
  55. );
  56. if (Objects.isNull(one)) {
  57. i.setIsCollection(false);
  58. }
  59. });
  60. return new PageUtils(list, count, pageSize, current);
  61. }
  62. /**
  63. * 按年月归集数据
  64. *
  65. * @param year 年 数字类型
  66. * @param month 月 数字
  67. * @param hospId 医院id
  68. */
  69. @Override
  70. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  71. public void collect(Integer year, Integer month, Long hospId) {
  72. // 可能几十万次数据 需要分段异步多线程处理,分布式锁处理,
  73. List<CostIncomeGroup> costIncomeGroups = incomeGroupMapper.selectList(
  74. new LambdaQueryWrapper<CostIncomeGroup>()
  75. .eq(CostIncomeGroup::getDateYear, year)
  76. .eq(CostIncomeGroup::getDateMonth, month)
  77. .eq(CostIncomeGroup::getHospId, hospId)
  78. );
  79. if (costIncomeGroups.isEmpty()) {
  80. String format = StrUtil.format("{}年{}月数据不存在,请先导入数据",year,month);
  81. throw new CostException(format);
  82. }
  83. // 根据会计科目和成本项目归纳所有数据
  84. Map<String, List<CostIncomeGroup>> collectMap = costIncomeGroups.stream()
  85. .collect(Collectors.groupingBy(i -> i.getAccountCode() + "cost" + i.getProductCode()));
  86. // 遍历map 组装成List保存
  87. List<IncomeCollection> list = new LinkedList<>();
  88. Set<Map.Entry<String, List<CostIncomeGroup>>> entries = collectMap.entrySet();
  89. entries.stream().map(Map.Entry::getValue).flatMap(Collection::stream).forEach(costIncomeGroup -> {
  90. IncomeCollection incomeCollection = new IncomeCollection();
  91. incomeCollection.setYear(year);
  92. incomeCollection.setMonth(month);
  93. incomeCollection.setAccountingCode(costIncomeGroup.getAccountCode());
  94. incomeCollection.setAccountingName(costIncomeGroup.getAccountName());
  95. incomeCollection.setProductName(costIncomeGroup.getProductName());
  96. incomeCollection.setProductCode(costIncomeGroup.getProductCode());
  97. incomeCollection.setHospId(hospId);
  98. // todo 来源id暂时不确定
  99. incomeCollection.setFileId(costIncomeGroup.getFileId());
  100. incomeCollection.setCreateTime(System.currentTimeMillis());
  101. // 开单中心的数据
  102. incomeCollection.setDepartmentCode(costIncomeGroup.getOpenDepartmentCode());
  103. incomeCollection.setResponsibilityCode(costIncomeGroup.getOpenResponsibilityCode());
  104. incomeCollection.setAmount(costIncomeGroup.getOpenDepartmentAmount());
  105. list.add(incomeCollection);
  106. // 执行科室数据
  107. incomeCollection.setDepartmentCode(costIncomeGroup.getStartDepartmentCode());
  108. incomeCollection.setResponsibilityCode(costIncomeGroup.getStartResponsibilityCode());
  109. incomeCollection.setAmount(costIncomeGroup.getStartDepartmentAmount());
  110. list.add(incomeCollection);
  111. });
  112. // TODO: 2021/8/10 几十万条数据如何处理
  113. this.saveBatch(list);
  114. }
  115. /**
  116. * 按年月撤销归集
  117. *
  118. * @param year 年 数字类型
  119. * @param month 月 数字
  120. * @param hospId 医院id
  121. */
  122. @Override
  123. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  124. public void cancelCollect(Integer year, Integer month, Long hospId) {
  125. LambdaQueryWrapper<IncomeCollection> wrapper = new LambdaQueryWrapper<IncomeCollection>()
  126. .eq(IncomeCollection::getYear, year)
  127. .eq(IncomeCollection::getMonth, month)
  128. .eq(IncomeCollection::getHospId, hospId);
  129. this.remove(wrapper);
  130. }
  131. }