CostShareParamGroupServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. package com.imed.costaccount.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.alibaba.druid.util.StringUtils;
  5. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  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.DateUtils;
  10. import com.imed.costaccount.common.util.Result;
  11. import com.imed.costaccount.common.util.UserContext;
  12. import com.imed.costaccount.constants.NumberConstant;
  13. import com.imed.costaccount.enums.DateStyleEnum;
  14. import com.imed.costaccount.mapper.CostShareParamGroupMapper;
  15. import com.imed.costaccount.model.*;
  16. import com.imed.costaccount.model.vo.IncomeErrorMessage;
  17. import com.imed.costaccount.service.CostIncomeFileService;
  18. import com.imed.costaccount.service.CostShareParamGroupService;
  19. import com.imed.costaccount.service.CostShareParamService;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.transaction.annotation.Propagation;
  22. import org.springframework.transaction.annotation.Transactional;
  23. import org.springframework.util.CollectionUtils;
  24. import org.springframework.web.multipart.MultipartFile;
  25. import java.math.BigDecimal;
  26. import java.util.*;
  27. import java.util.stream.Collectors;
  28. @Service("costShareParamGroupService")
  29. public class CostShareParamGroupServiceImpl extends ServiceImpl<CostShareParamGroupMapper, CostShareParamGroup> implements CostShareParamGroupService {
  30. private final CostIncomeGroupServiceImpl costIncomeGroupService;
  31. private final CostShareParamService costShareParamService;
  32. private final CostIncomeFileService costIncomeFileService;
  33. public CostShareParamGroupServiceImpl(CostIncomeGroupServiceImpl costIncomeGroupService, CostShareParamService costShareParamService, CostIncomeFileService costIncomeFileService) {
  34. this.costIncomeGroupService = costIncomeGroupService;
  35. this.costShareParamService = costShareParamService;
  36. this.costIncomeFileService = costIncomeFileService;
  37. }
  38. /**
  39. * 成本分摊参数导入
  40. *
  41. * @param list
  42. * @param user
  43. * @param file
  44. * @param dateTime
  45. * @param fileType
  46. * @return
  47. */
  48. @Override
  49. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  50. public Result importShareParamGroup(List<List<Object>> list, User user, MultipartFile file, String dateTime, Integer fileType) {
  51. // 先检验当前年月是否存在数据
  52. int year = 0;
  53. int month = 0;
  54. Date date = DateUtils.StringToDate(dateTime, DateStyleEnum.YYYY_MM);
  55. if (StrUtil.isNotBlank(dateTime)) {
  56. year = DateUtil.year(date);
  57. month = DateUtil.month(date) + 1;
  58. }
  59. Long hospId = user.getHospId();
  60. List<CostShareParamGroup> groups = this.list(new QueryWrapper<CostShareParamGroup>().lambda().eq(CostShareParamGroup::getHospId, hospId)
  61. .eq(CostShareParamGroup::getDateYear, year).eq(CostShareParamGroup::getDateMonth, month));
  62. if (!CollectionUtils.isEmpty(groups)) {
  63. throw new CostException(500, year + "年" + month + "月数据已存在");
  64. }
  65. for (int i = list.size() - 1; i >= 0; i--) {
  66. if (i == NumberConstant.ZERO || i == NumberConstant.ONE || i == NumberConstant.TWO || i == NumberConstant.THREE) {
  67. list.remove(list.get(i));
  68. }
  69. }
  70. List<IncomeErrorMessage> incomeErrorMessageList = new ArrayList<>();
  71. Map<String, Department> departmentMap = costIncomeGroupService.getDepartmentByCodeNameMap(hospId);
  72. Map<Long, Responsibility> responsibilityMap = costIncomeGroupService.getResponsibilityIdResponsibilityMap(hospId);
  73. List<ResponsibilityDepartment> responsibilityDepartmentList = costIncomeGroupService.getResponsibilityDepartments(hospId);
  74. if (CollectionUtils.isEmpty(responsibilityDepartmentList)) {
  75. throw new CostException(500, "没有科室责任中心对照数据");
  76. }
  77. Map<Long, Long> responsibilityDepMap = costIncomeGroupService.getDepartmentIdResponsibilityIdMap(responsibilityDepartmentList);
  78. Map<String, CostShareParam> shareParamMap = costShareParamService.list(new QueryWrapper<CostShareParam>().lambda().eq(CostShareParam::getHospId, hospId)).stream().collect(Collectors.toMap(k -> k.getShareParamCode() + k.getShareParamName(), synOe -> synOe));
  79. // 要保存的数据
  80. List<CostShareParamGroup> costShareParamGroupList = new LinkedList<>();
  81. List<Object> departmentCodes = list.get(0);
  82. List<Object> departmentNames = list.get(1);
  83. //检验数据是否准确 list包含了科室Code行与Name行 所以要从list的第三行开始
  84. checkShareParamGroupData(list, year, month, incomeErrorMessageList, departmentMap, responsibilityMap, responsibilityDepMap, shareParamMap, costShareParamGroupList, departmentCodes, departmentNames);
  85. // 文件上传
  86. String uploadFile = costIncomeGroupService.uploadFile(file, UserContext.getCurrentUser());
  87. // 上传记录保存
  88. if (StrUtil.isBlank(uploadFile)) {
  89. throw new CostException(500, "文件上传异常");
  90. }
  91. // 记录文件上传记录
  92. CostIncomeFile costIncomeFile = costIncomeFileService.saveCostIncomeFile(list, user, file, hospId, incomeErrorMessageList, uploadFile, fileType,year,month);
  93. Long id = costIncomeFile.getId();
  94. costShareParamGroupList.forEach(i -> {
  95. // 设置文件Id
  96. i.setFileId(id);
  97. });
  98. if (CollectionUtils.isEmpty(incomeErrorMessageList)) {
  99. this.saveBatch(costShareParamGroupList);
  100. return Result.build(200, "数据导入成功", null);
  101. } else {
  102. return Result.build(200, "数据未成功导入", null);
  103. }
  104. }
  105. private void checkShareParamGroupData(List<List<Object>> list, int year, int month, List<IncomeErrorMessage> incomeErrorMessageList, Map<String, Department> departmentMap, Map<Long, Responsibility> responsibilityMap, Map<Long, Long> responsibilityDepMap, Map<String, CostShareParam> shareParamMap, List<CostShareParamGroup> costShareParamGroupList, List<Object> departmentCodes, List<Object> departmentNames) {
  106. for (int i = 2; i < list.size(); i++) {
  107. int row = i + 4;
  108. List<Object> data = list.get(i);
  109. // 检验成本分摊参数是否正确
  110. CostShareParamGroup costShareParamGroupRequest = new CostShareParamGroup();
  111. String shareParamCode = data.get(0).toString();
  112. String shareParamName = data.get(1).toString();
  113. CostShareParam costShareParam = shareParamMap.get(shareParamCode + shareParamName);
  114. if (Objects.nonNull(costShareParam)) {
  115. costShareParamGroupRequest.setShareParamCode(shareParamCode);
  116. costShareParamGroupRequest.setShareParamName(shareParamName);
  117. } else {
  118. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  119. incomeErrorMessage.setTotal(1);
  120. incomeErrorMessage.setErrMessage("成本分摊代码:" + shareParamCode + " 名称" + shareParamName + "不存在");
  121. incomeErrorMessageList.add(incomeErrorMessage);
  122. }
  123. for (int j = 2; j < departmentCodes.size(); j++) {
  124. int column=j+1;
  125. if (data.size() > j ) {
  126. if (Objects.isNull(data.get(j))){
  127. data.set(j, NumberConstant.ZERO);
  128. }else if (data.get(j).toString().contains("-")||!StringUtils.isNumber(data.get(j).toString())){
  129. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  130. incomeErrorMessage.setTotal(row);
  131. incomeErrorMessage.setErrMessage("第"+row+"行 第"+column+"列数据不符合规范");
  132. incomeErrorMessageList.add(incomeErrorMessage);
  133. }else {
  134. data.set(j, Double.parseDouble(data.get(j).toString()));
  135. }
  136. }else {
  137. data.add(NumberConstant.ZERO);
  138. }
  139. }
  140. if (CollectionUtils.isEmpty(incomeErrorMessageList)) {
  141. // 检验数据是否全为0
  142. Integer zeroStatus = 0;
  143. for (int j = 2; j < data.size(); j++) {
  144. if (!NumberConstant.ZERO.equals(data.get(j))) {
  145. zeroStatus = 1;
  146. break;
  147. }
  148. }
  149. if (NumberConstant.ONE.equals(zeroStatus)) {
  150. for (int j = 2; j < data.size(); j++) {
  151. CostShareParamGroup costShareParamGroup = BeanUtil.convertObj(costShareParamGroupRequest, CostShareParamGroup.class);
  152. // 检验科室信息是否准确
  153. String departmentCode = departmentCodes.get(j).toString();
  154. String departmentName = departmentNames.get(j).toString();
  155. Department department = departmentMap.get(departmentCode + departmentName);
  156. if (Objects.nonNull(department)) {
  157. // 检测责任中心是否存在
  158. Long id = department.getId();
  159. Long responsibilityId = responsibilityDepMap.get(id);
  160. if (Objects.nonNull(responsibilityId)) {
  161. Responsibility responsibility = responsibilityMap.get(responsibilityId);
  162. if (Objects.nonNull(responsibility)) {
  163. costShareParamGroup.setResponsibilityCode(responsibility.getResponsibilityCode());
  164. costShareParamGroup.setResponsibilityName(responsibility.getResponsibilityName());
  165. } else {
  166. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  167. incomeErrorMessage.setTotal(j);
  168. incomeErrorMessage.setErrMessage("第" + j + "列科室信息对应的责任中心不存在");
  169. incomeErrorMessageList.add(incomeErrorMessage);
  170. }
  171. } else {
  172. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  173. incomeErrorMessage.setTotal(j);
  174. incomeErrorMessage.setErrMessage("第" + j + "列科室信息不存在对应的责任中心");
  175. incomeErrorMessageList.add(incomeErrorMessage);
  176. }
  177. } else {
  178. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  179. incomeErrorMessage.setTotal(j);
  180. incomeErrorMessage.setErrMessage("第" + j + "列科室信息不存在");
  181. incomeErrorMessageList.add(incomeErrorMessage);
  182. }
  183. costShareParamGroup.setAmount(BigDecimal.valueOf(Double.parseDouble(("0".equals(data.get(j).toString()) || StrUtil.isBlank(data.get(j).toString())) ? "0.00" : data.get(j).toString())));
  184. costShareParamGroup.setHospId(UserContext.getHospId());
  185. costShareParamGroup.setCreateTime(System.currentTimeMillis());
  186. costShareParamGroup.setDateYear(year);
  187. costShareParamGroup.setDateMonth(month);
  188. costShareParamGroupList.add(costShareParamGroup);
  189. }
  190. }
  191. }
  192. }
  193. }
  194. }