CostIncomeGroupServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package com.imed.costaccount.service.impl;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.imed.costaccount.common.exception.CostException;
  7. import com.imed.costaccount.common.util.BeanUtil;
  8. import com.imed.costaccount.common.util.DateUtils;
  9. import com.imed.costaccount.common.util.PageUtils;
  10. import com.imed.costaccount.common.util.Result;
  11. import com.imed.costaccount.constants.NumberConstant;
  12. import com.imed.costaccount.mapper.CostIncomeGroupMapper;
  13. import com.imed.costaccount.model.*;
  14. import com.imed.costaccount.model.vo.CostIncomeGroupAllAmountVO;
  15. import com.imed.costaccount.model.vo.CostIncomeGroupBeforeVO;
  16. import com.imed.costaccount.model.vo.IncomeErrorMessage;
  17. import com.imed.costaccount.service.*;
  18. import lombok.extern.slf4j.Slf4j;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.transaction.annotation.Propagation;
  21. import org.springframework.transaction.annotation.Transactional;
  22. import org.springframework.util.CollectionUtils;
  23. import java.math.BigDecimal;
  24. import java.util.*;
  25. import java.util.stream.Collectors;
  26. @Slf4j
  27. @Service("costIncomeGroupService")
  28. public class CostIncomeGroupServiceImpl extends ServiceImpl<CostIncomeGroupMapper, CostIncomeGroup> implements CostIncomeGroupService {
  29. private final DepartmentService departmentService;
  30. private final ResponsibilityService responsibilityService;
  31. private final ProductService productService;
  32. private final AccountingService accountingService;
  33. private final ResponsibilityDepartmentService responsibilityDepartmentService;
  34. private final AccountingProductService accountingProductService;
  35. public CostIncomeGroupServiceImpl(DepartmentService departmentService, ResponsibilityService responsibilityService, ProductService productService, AccountingService accountingService, ResponsibilityDepartmentService responsibilityDepartmentService, AccountingProductService accountingProductService) {
  36. this.departmentService = departmentService;
  37. this.responsibilityService = responsibilityService;
  38. this.productService = productService;
  39. this.accountingService = accountingService;
  40. this.responsibilityDepartmentService = responsibilityDepartmentService;
  41. this.accountingProductService = accountingProductService;
  42. }
  43. /**
  44. * 分页查询收入归集前的数据
  45. *
  46. * @param current 当前页
  47. * @param pageSize 当前页大小
  48. * @param dateTime 年月
  49. * @param responsibilityCode 责任中心代码
  50. * @param accountCode 会计科目的Code
  51. * @param hospId 医院Id
  52. * @return
  53. */
  54. @Override
  55. public PageUtils queryList(Integer current, Integer pageSize, String dateTime, String responsibilityCode, String accountCode, Long hospId) {
  56. int year = 0;
  57. int month=0;
  58. if (StrUtil.isNotBlank(dateTime)){
  59. year = DateUtils.getYear(dateTime);
  60. month=DateUtils.getMonth(dateTime);
  61. }
  62. Page<CostIncomeGroup> costIncomeGroupPage = new Page<>(current, pageSize);
  63. Page<CostIncomeGroup> pages= this.page(costIncomeGroupPage,new QueryWrapper<CostIncomeGroup>().lambda()
  64. .eq(Objects.nonNull(hospId),CostIncomeGroup::getHospId,hospId)
  65. .eq(!NumberConstant.ZERO.equals(year),CostIncomeGroup::getDateYear,year)
  66. .eq(!NumberConstant.ONE.equals(month),CostIncomeGroup::getDateMonth,month)
  67. .and(StrUtil.isNotBlank(responsibilityCode),i->i.like(CostIncomeGroup::getOpenResponsibilityCode,responsibilityCode)
  68. .or().like(CostIncomeGroup::getStartResponsibilityCode, responsibilityCode))
  69. .like(StrUtil.isNotBlank(accountCode),CostIncomeGroup::getAccountCode,accountCode));
  70. List<CostIncomeGroup> records = pages.getRecords();
  71. List<CostIncomeGroupBeforeVO> costIncomeGroupBeforeVOList = BeanUtil.convertList(records, CostIncomeGroupBeforeVO.class);
  72. // 查询所有的责任中心 科室 会计科目 成本项目的数据 处理名字
  73. setCodeName(hospId, costIncomeGroupBeforeVOList);
  74. // 进行金额合并
  75. List<CostIncomeGroupAllAmountVO> costIncomeGroupAllAmountVoS =baseMapper.countMoney(costIncomeGroupBeforeVOList);
  76. // 对,的金额进行合并
  77. costIncomeGroupAllAmountVoS.forEach(i->{
  78. String allMoney = i.getAllMoney();
  79. if (allMoney.contains(StrUtil.COMMA)){
  80. // 存在,在进行求和
  81. long sum;
  82. List<Long> list = Arrays.stream(allMoney.split(StrUtil.COMMA)).map(Long::valueOf).collect(Collectors.toList());
  83. sum = list.stream().mapToLong(m -> m).sum();
  84. i.setAmount(BigDecimal.valueOf(sum));
  85. }
  86. });
  87. PageUtils pageUtils = new PageUtils(pages);
  88. pageUtils.setList(costIncomeGroupAllAmountVoS);
  89. return pageUtils;
  90. }
  91. /**
  92. * 批量导入收入数据
  93. *
  94. * @param list 输入的文件
  95. * @param hospId 医院Id
  96. * @return
  97. */
  98. @Override
  99. @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
  100. public Result importIncomeGroup(List<List<Object>> list, Long hospId) {
  101. // 移除前几行的抬头内容 list的大小对应的就是行数的大小
  102. for (int i = list.size() - 1; i >= 0; i--) {
  103. if (i == NumberConstant.ZERO || i == NumberConstant.ONE || i == NumberConstant.TWO || i == NumberConstant.THREE) {
  104. list.remove(list.get(i));
  105. }
  106. }
  107. log.info("读取的数据为:{}", list);
  108. List<CostIncomeGroup> costIncomeGroupList = new ArrayList<>();
  109. List<IncomeErrorMessage> incomeErrorMessageList = new ArrayList<>();
  110. //获取所有的科室 成本项目 责任中心 会计科目
  111. Map<String, Department> departmentMap = departmentService.list(new QueryWrapper<Department>().lambda().eq(Department::getHospId, hospId)).stream().collect(Collectors.toMap(k -> k.getDepartmentCode() + k.getDepartmentName(), synOe -> synOe));
  112. Map<String,Product> productMap= productService.list(new QueryWrapper<Product>().lambda().eq(Product::getHospId, hospId)).stream().collect(Collectors.toMap(k -> k.getProductCode() + k.getProductName(), synOe -> synOe));
  113. Map<Long, Responsibility> responsibilityMap = responsibilityService.list(new QueryWrapper<Responsibility>().lambda().eq(Responsibility::getHospId, hospId)).stream().collect(Collectors.toMap(Responsibility::getId,synOe->synOe));
  114. Map<Long, Accounting> accountingMap = accountingService.list(new QueryWrapper<Accounting>().lambda().eq(Accounting::getHospId, hospId)).stream().collect(Collectors.toMap(Accounting::getId, synOe -> synOe));
  115. List<ResponsibilityDepartment> responsibilityDepartmentList = responsibilityDepartmentService.list(new QueryWrapper<ResponsibilityDepartment>().lambda()
  116. .eq(ResponsibilityDepartment::getHospId, hospId));
  117. if (CollectionUtils.isEmpty(responsibilityDepartmentList)){
  118. throw new CostException(500,"没有科室责任中心对照数据");
  119. }
  120. List<AccountingProduct> accountingProductList = accountingProductService.list(new QueryWrapper<AccountingProduct>().lambda().eq(AccountingProduct::getHospId, hospId));
  121. if (CollectionUtils.isEmpty(accountingProductList)){
  122. throw new CostException(500,"没有成本会计对照数据");
  123. }
  124. Map<Long, Long> responsibilityDepMap = responsibilityDepartmentList.stream().collect(Collectors.toMap(ResponsibilityDepartment::getDepartmentId, ResponsibilityDepartment::getResponsibilityId));
  125. Map<Long, Long> accountProMap = accountingProductList.stream().collect(Collectors.toMap(AccountingProduct::getProductId, AccountingProduct::getAccountingId));
  126. for (int i = 0; i < list.size(); i++) {
  127. // 用来检验数据合理性的循环
  128. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  129. List<Object> data = list.get(i);
  130. log.info("用户输入的数据是{}",data);
  131. Object money = data.get(data.size() - 1);
  132. if (!Objects.isNull(money) && !NumberConstant.ZERO.equals(Integer.parseInt(money.toString()))){
  133. // 要求这一行的数据必须全部填写
  134. for (int j=0;j<data.size();j++){
  135. if (Objects.isNull(data.get(j))){
  136. incomeErrorMessage.setTotal(i);
  137. int row=i+1;
  138. int column=j+1;
  139. incomeErrorMessage.setErrMessage("第{"+row+"}行第{"+column+"}列数据为空");
  140. incomeErrorMessageList.add(incomeErrorMessage);
  141. }
  142. }
  143. // TODO 暂时不走循环 直接获取数据的处理
  144. // 成本项目的代码和名称
  145. String productCode = data.get(0).toString();
  146. String productName = data.get(1).toString();
  147. // 开单科室 执行科室的代码和名称
  148. String openDepartmentName = data.get(2).toString();
  149. String openDepartmentCode = data.get(3).toString();
  150. String startDepartmentName = data.get(4).toString();
  151. String startDepartmentCode = data.get(5).toString();
  152. // 检验数据是否存在
  153. Product product = productMap.get(productCode + productName);
  154. Department department = departmentMap.get(openDepartmentCode + openDepartmentName);
  155. Department department1 = departmentMap.get(startDepartmentCode + startDepartmentName);
  156. if (Objects.isNull(product)){
  157. incomeErrorMessage.setTotal(i);
  158. incomeErrorMessage.setErrMessage("代码:"+productCode+" 名称:"+productName+"成本项目不存在");
  159. incomeErrorMessageList.add(incomeErrorMessage);
  160. }else {
  161. // 检验对应的会计科目是否存在
  162. Long id = product.getId();
  163. }
  164. if (Objects.isNull(department)){
  165. incomeErrorMessage.setTotal(i);
  166. incomeErrorMessage.setErrMessage("代码:"+productCode+" 名称:"+productName+"开单科室不存在");
  167. incomeErrorMessageList.add(incomeErrorMessage);
  168. }
  169. if (Objects.isNull(department1)){
  170. incomeErrorMessage.setTotal(i);
  171. incomeErrorMessage.setErrMessage("代码:"+productCode+" 名称:"+productName+"执行科室不存在");
  172. incomeErrorMessageList.add(incomeErrorMessage);
  173. }
  174. // 检验科室对应的责任中心是否存在
  175. // 检验成本项目对应的会计科目是否存在
  176. }
  177. }
  178. return Result.ok();
  179. }
  180. /**
  181. * 设置相关名称
  182. * @param hospId
  183. * @param costIncomeGroupBeforeVOList
  184. */
  185. private void setCodeName(Long hospId, List<CostIncomeGroupBeforeVO> costIncomeGroupBeforeVOList) {
  186. List<Responsibility> responsibilityList = responsibilityService.list(new QueryWrapper<Responsibility>().lambda().eq(Responsibility::getHospId, hospId));
  187. Map<String, String> responsibilityMap = responsibilityList.stream().collect(Collectors.toMap(Responsibility::getResponsibilityCode,Responsibility::getResponsibilityName));
  188. List<Department> departmentList = departmentService.list(new QueryWrapper<Department>().lambda().eq(Department::getHospId, hospId));
  189. Map<String, String> departmentMap = departmentList.stream().collect(Collectors.toMap(Department::getDepartmentCode,Department::getDepartmentName));
  190. List<Product> productList = productService.list(new QueryWrapper<Product>().lambda().eq(Product::getHospId, hospId));
  191. Map<String, String> productMap = productList.stream().collect(Collectors.toMap(Product::getProductCode,Product::getProductName));
  192. List<Accounting> accountingList = accountingService.list(new QueryWrapper<Accounting>().lambda().eq(Accounting::getHospId, hospId));
  193. Map<String, String> accountMap = accountingList.stream().collect(Collectors.toMap(Accounting::getAccountingCode,Accounting::getAccountingName));
  194. costIncomeGroupBeforeVOList.forEach(i->{
  195. // 以为这里的数据导入的 在导入的时候进行数据校验
  196. // 设置开单科室名称 执行科室名称 开单责任中心名称 执行责任中心名称 成本项目的名称 会计科目名称
  197. i.setOpenDepartmentCodeName("["+i.getOpenDepartmentCode()+"]"+departmentMap.get(i.getOpenDepartmentCode()));
  198. i.setOpenResponsibilityCodeName("["+i.getOpenResponsibilityCode()+"]"+responsibilityMap.get(i.getOpenResponsibilityCode()));
  199. i.setStartDepartmentCodeName("["+i.getStartDepartmentCode()+"]"+departmentMap.get(i.getStartDepartmentCode()));
  200. i.setStartResponsibilityCodeName("["+i.getStartResponsibilityCode()+"]"+responsibilityMap.get(i.getStartResponsibilityCode()));
  201. i.setProductCodeName("["+i.getProductCode()+"]"+productMap.get(i.getProductCode()));
  202. i.setAccountCodeName("["+i.getAccountCode()+"]"+accountMap.get(i.getAccountCode()));
  203. });
  204. }
  205. /**
  206. * 收入数据导入
  207. */
  208. }