IncomeCollectionServiceImpl.java 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package com.imed.costaccount.service.impl;
  2. import cn.hutool.core.util.StrUtil;
  3. import cn.hutool.json.JSONUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.imed.costaccount.common.exception.CostException;
  7. import com.imed.costaccount.common.util.PageUtils;
  8. import com.imed.costaccount.mapper.CostIncomeGroupMapper;
  9. import com.imed.costaccount.mapper.IncomeCollectionMapper;
  10. import com.imed.costaccount.model.AfterIncomegroup;
  11. import com.imed.costaccount.model.CostIncomeGroup;
  12. import com.imed.costaccount.model.IncomeCollection;
  13. import com.imed.costaccount.model.dto.CollectDTO;
  14. import com.imed.costaccount.model.vo.CollectedVO;
  15. import com.imed.costaccount.model.vo.CollectionVO;
  16. import com.imed.costaccount.service.IncomeCollectionService;
  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 java.math.BigDecimal;
  22. import java.util.*;
  23. import java.util.stream.Collectors;
  24. import static com.imed.costaccount.common.constants.Constant.LIMIT;
  25. @Slf4j
  26. @Service("incomeCollectionService")
  27. public class IncomeCollectionServiceImpl
  28. extends ServiceImpl<IncomeCollectionMapper, IncomeCollection>
  29. implements IncomeCollectionService {
  30. private final CostIncomeGroupMapper incomeGroupMapper;
  31. public IncomeCollectionServiceImpl(CostIncomeGroupMapper incomeGroupMapper) {
  32. this.incomeGroupMapper = incomeGroupMapper;
  33. }
  34. /**
  35. * 获取收入归集分页列表
  36. *
  37. * @param current 当前页
  38. * @param pageSize 页码数据大小
  39. * @param date 日期 yyyy-MM-dd
  40. * @param hospId 医院id
  41. * @return {@link PageUtils} 分页对象
  42. */
  43. @Override
  44. public PageUtils getCollections(Integer current, Integer pageSize, String date, Long hospId) {
  45. current = current - 1;
  46. Integer startIndex = current * pageSize;
  47. List<CollectionVO> list = incomeGroupMapper.getCollections(startIndex, pageSize, date, hospId);
  48. int count = incomeGroupMapper.getCollectionCount(date, hospId);
  49. // 设置是否归集字段
  50. list.forEach(i -> {
  51. i.setIsCollection(true);
  52. IncomeCollection one = this.getOne(
  53. new LambdaQueryWrapper<IncomeCollection>().select(IncomeCollection::getId)
  54. .eq(IncomeCollection::getYear, i.getYear())
  55. .eq(IncomeCollection::getMonth, i.getMonth())
  56. .last(LIMIT)
  57. );
  58. if (Objects.isNull(one)) {
  59. i.setIsCollection(false);
  60. }
  61. });
  62. return new PageUtils(list, count, pageSize, current);
  63. }
  64. /**
  65. * 按年月归集数据
  66. *
  67. * @param year 年 数字类型
  68. * @param month 月 数字
  69. * @param hospId 医院id
  70. */
  71. @Override
  72. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  73. public void collect(Integer year, Integer month, Long hospId) {
  74. // 可能几十万次数据 需要分段异步多线程处理,分布式锁处理,
  75. List<CostIncomeGroup> costIncomeGroups = incomeGroupMapper.selectList(
  76. new LambdaQueryWrapper<CostIncomeGroup>()
  77. .eq(CostIncomeGroup::getDateYear, year)
  78. .eq(CostIncomeGroup::getDateMonth, month)
  79. .eq(CostIncomeGroup::getHospId, hospId)
  80. );
  81. if (costIncomeGroups.isEmpty()) {
  82. String format = StrUtil.format("{}年{}月数据不存在,请先导入数据", year, month);
  83. throw new CostException(format);
  84. }
  85. // 根据会计科目和成本项目归纳所有数据
  86. Map<String, List<CostIncomeGroup>> collectMap = costIncomeGroups.stream()
  87. .collect(Collectors.groupingBy(i -> i.getAccountCode() + "cost" + i.getProductCode()));
  88. // 遍历map 组装成List保存
  89. List<IncomeCollection> list = new LinkedList<>();
  90. Set<Map.Entry<String, List<CostIncomeGroup>>> entries = collectMap.entrySet();
  91. entries.stream().map(Map.Entry::getValue).flatMap(Collection::stream).forEach(costIncomeGroup -> {
  92. IncomeCollection incomeCollection = new IncomeCollection();
  93. incomeCollection.setYear(year);
  94. incomeCollection.setMonth(month);
  95. incomeCollection.setAccountingCode(costIncomeGroup.getAccountCode());
  96. incomeCollection.setAccountingName(costIncomeGroup.getAccountName());
  97. incomeCollection.setProductName(costIncomeGroup.getProductName());
  98. incomeCollection.setProductCode(costIncomeGroup.getProductCode());
  99. incomeCollection.setAmount(costIncomeGroup.getAmount());
  100. incomeCollection.setHospId(hospId);
  101. // todo 来源id暂时不确定
  102. incomeCollection.setFileId(costIncomeGroup.getFileId());
  103. incomeCollection.setCreateTime(System.currentTimeMillis());
  104. String afterIncomeGroupStr = costIncomeGroup.getAfterIncomeGroup();
  105. AfterIncomegroup afterIncomegroup = JSONUtil.toBean(afterIncomeGroupStr, AfterIncomegroup.class);
  106. if (Objects.isNull(afterIncomegroup)) {
  107. throw new CostException("未能正确归集对应的....");
  108. }
  109. // 转换一下其他的
  110. if (afterIncomegroup.getDirectStatus() == 2) {
  111. afterIncomegroup.setDirectStatus(0);
  112. }
  113. incomeCollection.setIsDirectIncome(afterIncomegroup.getDirectStatus());
  114. // 开单中心的数据
  115. incomeCollection.setDepartmentCode(afterIncomegroup.getOpenDepartmentCode());
  116. incomeCollection.setDepartmentName(afterIncomegroup.getOpenDepartmentName());
  117. incomeCollection.setResponsibilityCode(afterIncomegroup.getResponsibilityCode());
  118. incomeCollection.setResponsibilityName(afterIncomegroup.getResponsibilityName());
  119. list.add(incomeCollection);
  120. // 执行科室数据
  121. incomeCollection.setDepartmentCode(afterIncomegroup.getStartDepartmentCode());
  122. incomeCollection.setDepartmentName(afterIncomegroup.getStartDepartmentName());
  123. incomeCollection.setResponsibilityCode(afterIncomegroup.getResponsibilityCode());
  124. incomeCollection.setResponsibilityName(afterIncomegroup.getResponsibilityName());
  125. list.add(incomeCollection);
  126. });
  127. // TODO: 2021/8/10 几十万条数据如何处理 待测试处理
  128. this.saveBatch(list);
  129. }
  130. /**
  131. * 按年月撤销归集
  132. *
  133. * @param year 年 数字类型
  134. * @param month 月 数字
  135. * @param hospId 医院id
  136. */
  137. @Override
  138. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  139. public void cancelCollect(Integer year, Integer month, Long hospId) {
  140. LambdaQueryWrapper<IncomeCollection> wrapper = new LambdaQueryWrapper<IncomeCollection>()
  141. .eq(IncomeCollection::getYear, year)
  142. .eq(IncomeCollection::getMonth, month)
  143. .eq(IncomeCollection::getHospId, hospId);
  144. this.remove(wrapper);
  145. }
  146. /**
  147. * 归集后数据分页列表
  148. *
  149. * @param collectDTO {@link CollectDTO} 查询相关参数
  150. * @return {@link PageUtils}
  151. */
  152. @Override
  153. public PageUtils collectList(CollectDTO collectDTO) {
  154. // 分页数据初始化
  155. Integer current = collectDTO.getCurrent();
  156. current = (Objects.isNull(current) || current == 0) ? 0 : current - 1;
  157. Integer pageSize = collectDTO.getPageSize();
  158. pageSize = Objects.isNull(pageSize) ? 10 : pageSize;
  159. collectDTO.setCurrent(current * pageSize);
  160. collectDTO.setPageSize(pageSize);
  161. // 查询需要的数据 DB
  162. List<CollectedVO> list = baseMapper.getCollectList(collectDTO);
  163. int count = baseMapper.getCollectListCount(collectDTO);
  164. BigDecimal totalAmount = baseMapper.getTotalAmount(collectDTO);
  165. return new PageUtils(list, count, pageSize, current, totalAmount);
  166. }
  167. }