|
@@ -1,36 +1,32 @@
|
|
|
package com.imed.costaccount.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.hutool.json.JSONUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.imed.costaccount.common.exception.CostException;
|
|
|
import com.imed.costaccount.common.util.BeanUtil;
|
|
|
-import com.imed.costaccount.common.util.DateUtils;
|
|
|
import com.imed.costaccount.common.util.PageUtils;
|
|
|
import com.imed.costaccount.common.util.RedisLock;
|
|
|
-import com.imed.costaccount.constants.NumberConstant;
|
|
|
-import com.imed.costaccount.enums.DateStyleEnum;
|
|
|
import com.imed.costaccount.mapper.CostIncomeGroupMapper;
|
|
|
import com.imed.costaccount.mapper.IncomeCollectionMapper;
|
|
|
import com.imed.costaccount.model.*;
|
|
|
import com.imed.costaccount.model.dto.CollectDTO;
|
|
|
import com.imed.costaccount.model.vo.*;
|
|
|
-import com.imed.costaccount.service.AccountingService;
|
|
|
+import com.imed.costaccount.service.CostIncomeGroupSetService;
|
|
|
import com.imed.costaccount.service.IncomeCollectionService;
|
|
|
-import com.imed.costaccount.service.ResponsibilityService;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import org.springframework.transaction.annotation.Propagation;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
-import org.springframework.util.CollectionUtils;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
+import java.util.stream.Stream;
|
|
|
|
|
|
import static com.imed.costaccount.common.constants.Constant.LIMIT;
|
|
|
|
|
@@ -45,15 +41,12 @@ public class IncomeCollectionServiceImpl
|
|
|
|
|
|
private final CostIncomeGroupMapper incomeGroupMapper;
|
|
|
|
|
|
- private final ResponsibilityService responsibilityService;
|
|
|
+ private final CostIncomeGroupSetService incomeGroupSetService;
|
|
|
|
|
|
- private final AccountingService accountingService;
|
|
|
-
|
|
|
- public IncomeCollectionServiceImpl(RedisLock redisLock, CostIncomeGroupMapper incomeGroupMapper, ResponsibilityService responsibilityService, AccountingService accountingService) {
|
|
|
+ public IncomeCollectionServiceImpl(RedisLock redisLock, CostIncomeGroupMapper incomeGroupMapper, CostIncomeGroupSetService incomeGroupSetService) {
|
|
|
this.redisLock = redisLock;
|
|
|
this.incomeGroupMapper = incomeGroupMapper;
|
|
|
- this.responsibilityService = responsibilityService;
|
|
|
- this.accountingService = accountingService;
|
|
|
+ this.incomeGroupSetService = incomeGroupSetService;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -108,14 +101,12 @@ public class IncomeCollectionServiceImpl
|
|
|
boolean lock = redisLock.lock(key, timestamp);
|
|
|
try {
|
|
|
if (lock) {
|
|
|
- List<CostIncomeGroupAllAmountBO> costIncomeGroups = incomeGroupMapper.selectListAndMoney(year,month,hospId);
|
|
|
-// List<CostIncomeGroup> costIncomeGroups = incomeGroupMapper.selectList(
|
|
|
-// new LambdaQueryWrapper<CostIncomeGroup>()
|
|
|
-// .eq(CostIncomeGroup::getDateYear, year)
|
|
|
-// .eq(CostIncomeGroup::getDateMonth, month)
|
|
|
-// .eq(CostIncomeGroup::getHospId, hospId)
|
|
|
-// .groupBy(CostIncomeGroup::getOpenDepartmentCode, CostIncomeGroup::getStartDepartmentCode, CostIncomeGroup::getProductCode)
|
|
|
-// );
|
|
|
+ List<CostIncomeGroup> costIncomeGroups = incomeGroupMapper.selectList(
|
|
|
+ new LambdaQueryWrapper<CostIncomeGroup>()
|
|
|
+ .eq(CostIncomeGroup::getDateYear, year)
|
|
|
+ .eq(CostIncomeGroup::getDateMonth, month)
|
|
|
+ .eq(CostIncomeGroup::getHospId, hospId)
|
|
|
+ );
|
|
|
|
|
|
if (costIncomeGroups.isEmpty()) {
|
|
|
String format = StrUtil.format("{}年{}月数据不存在,请先导入数据", year, month);
|
|
@@ -127,21 +118,13 @@ public class IncomeCollectionServiceImpl
|
|
|
new LambdaQueryWrapper<IncomeCollection>().eq(IncomeCollection::getYear, year).eq(IncomeCollection::getMonth, month).eq(IncomeCollection::getHospId, hospId)
|
|
|
);
|
|
|
// 根据会计科目和成本项目归纳所有数据
|
|
|
- Map<String, List<CostIncomeGroupAllAmountBO>> collectMap = costIncomeGroups.stream()
|
|
|
+ Map<String, List<CostIncomeGroup>> collectMap = costIncomeGroups.stream()
|
|
|
.collect(Collectors.groupingBy(i -> i.getOpenDepartmentCode() + "cost" + i.getStartDepartmentCode() + "cost" + i.getProductCode()));
|
|
|
|
|
|
// 遍历map 组装成List保存
|
|
|
List<IncomeCollection> list = new LinkedList<>();
|
|
|
- Set<Map.Entry<String, List<CostIncomeGroupAllAmountBO>>> entries = collectMap.entrySet();
|
|
|
+ Set<Map.Entry<String, List<CostIncomeGroup>>> entries = collectMap.entrySet();
|
|
|
entries.stream().map(Map.Entry::getValue).flatMap(Collection::stream).forEach(costIncomeGroup -> {
|
|
|
- String allMoney = costIncomeGroup.getAllMoney();
|
|
|
- if (StrUtil.isNotBlank(allMoney) && allMoney.contains(StrUtil.COMMA)) {
|
|
|
- // 存在,在进行求和
|
|
|
- BigDecimal sum;
|
|
|
- List<BigDecimal> bigDecimals = Arrays.stream(allMoney.split(StrUtil.COMMA)).map(BigDecimal::new).collect(Collectors.toList());
|
|
|
- sum = bigDecimals.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
- costIncomeGroup.setAmount(sum);
|
|
|
- }
|
|
|
//TODO 统计总金额
|
|
|
IncomeCollection incomeCollection = new IncomeCollection();
|
|
|
incomeCollection.setYear(year);
|
|
@@ -150,7 +133,6 @@ public class IncomeCollectionServiceImpl
|
|
|
incomeCollection.setAccountingName(costIncomeGroup.getAccountName());
|
|
|
incomeCollection.setProductName(costIncomeGroup.getProductName());
|
|
|
incomeCollection.setProductCode(costIncomeGroup.getProductCode());
|
|
|
-// incomeCollection.setAmount(costIncomeGroup.getAmount());
|
|
|
incomeCollection.setHospId(hospId);
|
|
|
// todo 来源id暂时不确定
|
|
|
incomeCollection.setFileId(costIncomeGroup.getFileId());
|
|
@@ -161,15 +143,83 @@ public class IncomeCollectionServiceImpl
|
|
|
throw new CostException("未能正确归集对应的....");
|
|
|
}
|
|
|
// 转换一下其他的
|
|
|
+ if (afterIncomegroup.getOpenDepartmentStatus() == 1 && afterIncomegroup.getStartDepartmentStatus() == 1) {
|
|
|
+ // 排除会计科目
|
|
|
+ List<CostIncomeGroupSet> sets = incomeGroupSetService.list(
|
|
|
+ new LambdaQueryWrapper<CostIncomeGroupSet>()
|
|
|
+ .eq(CostIncomeGroupSet::getOpenDepartmentStatus, 1).eq(CostIncomeGroupSet::getStartDepartmentStatus, 1).eq(CostIncomeGroupSet::getHospId, hospId)
|
|
|
+ );
|
|
|
+ if (!sets.isEmpty()) {
|
|
|
+ for (CostIncomeGroupSet set : sets) {
|
|
|
+ String accountCode = set.getAccountCode();
|
|
|
+ if (StrUtil.isBlank(accountCode)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ String[] split = accountCode.split(StrUtil.COMMA);
|
|
|
+ boolean contains = CollUtil.newArrayList(split).contains(costIncomeGroup.getAccountCode());
|
|
|
+ if (contains) {
|
|
|
+ // 钱全给执行科室
|
|
|
+ incomeCollection.setAmount(new BigDecimal("0.0000"));
|
|
|
+ incomeCollection.setDepartmentCode(afterIncomegroup.getOpenDepartmentCode());
|
|
|
+ incomeCollection.setDepartmentName(afterIncomegroup.getOpenDepartmentName());
|
|
|
+ incomeCollection.setResponsibilityCode(afterIncomegroup.getOpenResponsibilityCode());
|
|
|
+ incomeCollection.setResponsibilityName(afterIncomegroup.getOpenResponsibilityName());
|
|
|
+
|
|
|
+ list.add(incomeCollection);
|
|
|
+ // 执行科室数据
|
|
|
+
|
|
|
+ IncomeCollection startCollect = BeanUtil.convertObj(incomeCollection, IncomeCollection.class);
|
|
|
+ startCollect.setAmount(costIncomeGroup.getAmount());
|
|
|
+ startCollect.setDepartmentCode(afterIncomegroup.getStartDepartmentCode());
|
|
|
+ startCollect.setDepartmentName(afterIncomegroup.getStartDepartmentName());
|
|
|
+ startCollect.setResponsibilityCode(afterIncomegroup.getStartResponsibilityCode());
|
|
|
+ startCollect.setResponsibilityName(afterIncomegroup.getStartResponsibilityName());
|
|
|
+ log.info("start:{}", startCollect);
|
|
|
+ log.info("open:{}", incomeCollection);
|
|
|
+ list.add(startCollect);
|
|
|
+ } else {
|
|
|
+ if (afterIncomegroup.getDirectStatus() == 2) {
|
|
|
+ afterIncomegroup.setDirectStatus(0);
|
|
|
+ }
|
|
|
+ incomeCollection.setIsDirectIncome(afterIncomegroup.getDirectStatus());
|
|
|
+ String responsibilityCode = afterIncomegroup.getResponsibilityCode();
|
|
|
+ if (StrUtil.isNotBlank(responsibilityCode)) {
|
|
|
+ incomeCollection.setDepartmentName(afterIncomegroup.getOpenDepartmentName() + "|" + afterIncomegroup.getStartDepartmentName());
|
|
|
+ incomeCollection.setDepartmentCode(afterIncomegroup.getOpenDepartmentCode() + "|" + afterIncomegroup.getStartDepartmentCode());
|
|
|
+ incomeCollection.setResponsibilityCode(responsibilityCode);
|
|
|
+ incomeCollection.setResponsibilityName(afterIncomegroup.getResponsibilityName());
|
|
|
+ incomeCollection.setAmount(afterIncomegroup.getOtherResponsibilityDecimal());
|
|
|
+ list.add(incomeCollection);
|
|
|
+ } else {
|
|
|
+ // 开单中心的数据
|
|
|
+ incomeCollection.setAmount(afterIncomegroup.getOpenDepartmentDecimal());
|
|
|
+ incomeCollection.setDepartmentCode(afterIncomegroup.getOpenDepartmentCode());
|
|
|
+ incomeCollection.setDepartmentName(afterIncomegroup.getOpenDepartmentName());
|
|
|
+ incomeCollection.setResponsibilityCode(afterIncomegroup.getOpenResponsibilityCode());
|
|
|
+ incomeCollection.setResponsibilityName(afterIncomegroup.getOpenResponsibilityName());
|
|
|
+
|
|
|
+ list.add(incomeCollection);
|
|
|
+ // 执行科室数据
|
|
|
+
|
|
|
+ IncomeCollection startCollect = BeanUtil.convertObj(incomeCollection, IncomeCollection.class);
|
|
|
+ startCollect.setAmount(afterIncomegroup.getStartDepartmentDecimal());
|
|
|
+ startCollect.setDepartmentCode(afterIncomegroup.getStartDepartmentCode());
|
|
|
+ startCollect.setDepartmentName(afterIncomegroup.getStartDepartmentName());
|
|
|
+ startCollect.setResponsibilityCode(afterIncomegroup.getStartResponsibilityCode());
|
|
|
+ startCollect.setResponsibilityName(afterIncomegroup.getStartResponsibilityName());
|
|
|
+ log.info("start:{}", startCollect);
|
|
|
+ log.info("open:{}", incomeCollection);
|
|
|
+ list.add(startCollect);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
if (afterIncomegroup.getDirectStatus() == 2) {
|
|
|
afterIncomegroup.setDirectStatus(0);
|
|
|
}
|
|
|
incomeCollection.setIsDirectIncome(afterIncomegroup.getDirectStatus());
|
|
|
-// String responsibilityCode = afterIncomegroup.getResponsibilityCode();
|
|
|
-// if (StrUtil.isBlank(responsibilityCode)) {
|
|
|
-// responsibilityCode = "-";
|
|
|
-// afterIncomegroup.setResponsibilityName("-");
|
|
|
-// }
|
|
|
String responsibilityCode = afterIncomegroup.getResponsibilityCode();
|
|
|
if (StrUtil.isNotBlank(responsibilityCode)) {
|
|
|
incomeCollection.setDepartmentName(afterIncomegroup.getOpenDepartmentName() + "|" + afterIncomegroup.getStartDepartmentName());
|
|
@@ -199,11 +249,26 @@ public class IncomeCollectionServiceImpl
|
|
|
log.info("open:{}", incomeCollection);
|
|
|
list.add(startCollect);
|
|
|
}
|
|
|
+
|
|
|
});
|
|
|
|
|
|
|
|
|
// TODO: 2021/8/10 几十万条数据如何处理 待测试处理
|
|
|
- this.saveBatch(list);
|
|
|
+
|
|
|
+ Map<String, List<IncomeCollection>> collect = list.stream().collect(Collectors.groupingBy(i -> i.getDepartmentCode() + "cost" + i.getResponsibilityCode() + "cost" + i.getAccountingCode() + "cost" + i.getProductCode()));
|
|
|
+ List<IncomeCollection> realList = new LinkedList<>();
|
|
|
+ Set<String> strings = collect.keySet();
|
|
|
+ for (String str : strings) {
|
|
|
+ List<IncomeCollection> incomeCollections = collect.get(str);
|
|
|
+ if (CollUtil.isNotEmpty(incomeCollections)) {
|
|
|
+ BigDecimal reduce = incomeCollections.stream().map(IncomeCollection::getAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
+ IncomeCollection incomeCollection = incomeCollections.get(0);
|
|
|
+ incomeCollection.setAmount(reduce);
|
|
|
+ realList.add(incomeCollection);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ this.saveBatch(realList);
|
|
|
} else {
|
|
|
throw new CostException("已有人在操作,请稍后重试");
|
|
|
}
|