CostCostingGroupServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. package com.imed.costaccount.service.impl;
  2. import cn.hutool.core.date.DateUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.imed.costaccount.common.exception.CostException;
  7. import com.imed.costaccount.common.util.DateUtils;
  8. import com.imed.costaccount.common.util.Result;
  9. import com.imed.costaccount.common.util.UserContext;
  10. import com.imed.costaccount.constants.NumberConstant;
  11. import com.imed.costaccount.enums.DateStyleEnum;
  12. import com.imed.costaccount.mapper.CostCostingGroupMapper;
  13. import com.imed.costaccount.model.*;
  14. import com.imed.costaccount.model.vo.IncomeErrorMessage;
  15. import com.imed.costaccount.service.AccountingProductService;
  16. import com.imed.costaccount.service.CostCostingGroupService;
  17. import com.imed.costaccount.service.CostIncomeFileService;
  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 org.springframework.web.multipart.MultipartFile;
  24. import java.math.BigDecimal;
  25. import java.util.*;
  26. @Service("costCostingGroupService")
  27. @Slf4j
  28. public class CostCostingGroupServiceImpl extends ServiceImpl<CostCostingGroupMapper, CostCostingGroup> implements CostCostingGroupService {
  29. private final CostIncomeGroupServiceImpl costIncomeGroupService;
  30. private final AccountingProductService accountingProductService;
  31. private final CostIncomeFileService costIncomeFileService;
  32. public CostCostingGroupServiceImpl(CostIncomeGroupServiceImpl costIncomeGroupService, AccountingProductService accountingProductService, CostIncomeFileService costIncomeFileService) {
  33. this.costIncomeGroupService = costIncomeGroupService;
  34. this.accountingProductService = accountingProductService;
  35. this.costIncomeFileService = costIncomeFileService;
  36. }
  37. /**
  38. * 批量导入成本数据
  39. *
  40. * @param list
  41. * @param user
  42. * @param file
  43. * @param dateTime
  44. * @param fileType
  45. * @return
  46. */
  47. @Override
  48. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  49. public Result importCostingGroup(List<List<Object>> list, User user, MultipartFile file, String dateTime, Integer fileType) {
  50. // 先检验当前年月是否存在数据
  51. int year = 0;
  52. int month = 0;
  53. Date date = DateUtils.StringToDate(dateTime, DateStyleEnum.YYYY_MM);
  54. if (StrUtil.isNotBlank(dateTime)) {
  55. year = DateUtil.year(date);
  56. month = DateUtil.month(date) + 1;
  57. }
  58. Long hospId = user.getHospId();
  59. List<CostCostingGroup> groups = this.list(new QueryWrapper<CostCostingGroup>().lambda().eq(CostCostingGroup::getHospId, hospId)
  60. .eq(CostCostingGroup::getDateYear, year).eq(CostCostingGroup::getDateMonth, month));
  61. if (!CollectionUtils.isEmpty(groups)) {
  62. throw new CostException(500, year + "年" + month + "月数据已存在");
  63. }
  64. for (int i = list.size() - 1; i >= 0; i--) {
  65. if (i == NumberConstant.ZERO || i == NumberConstant.ONE || i == NumberConstant.TWO || i == NumberConstant.THREE) {
  66. list.remove(list.get(i));
  67. }
  68. }
  69. List<IncomeErrorMessage> incomeErrorMessageList = new ArrayList<>();
  70. //获取所有的科室 成本项目 责任中心 会计科目
  71. Map<String, Department> departmentMap = costIncomeGroupService.getDepartmentByCodeNameMap(hospId);
  72. Map<String, Product> productMap = costIncomeGroupService.getProductByCodeNameMap(hospId);
  73. Map<Long, Responsibility> responsibilityMap = costIncomeGroupService.getResponsibilityIdResponsibilityMap(hospId);
  74. Map<Long, Accounting> accountingMap = costIncomeGroupService.getAccountIdAccountingMap(hospId);
  75. List<ResponsibilityDepartment> responsibilityDepartmentList = costIncomeGroupService.getResponsibilityDepartments(hospId);
  76. if (CollectionUtils.isEmpty(responsibilityDepartmentList)) {
  77. throw new CostException(500, "没有科室责任中心对照数据");
  78. }
  79. List<AccountingProduct> accountingProductList = accountingProductService.list(new QueryWrapper<AccountingProduct>().lambda().eq(AccountingProduct::getHospId, hospId));
  80. if (CollectionUtils.isEmpty(accountingProductList)) {
  81. throw new CostException(500, "没有成本会计对照数据");
  82. }
  83. Map<Long, Long> responsibilityDepMap = costIncomeGroupService.getDepartmentIdResponsibilityIdMap(responsibilityDepartmentList);
  84. Map<Long, Long> accountProMap = costIncomeGroupService.getProductIdAccountIdMap(accountingProductList);
  85. String endStatus = list.get(0).get(list.get(0).size() - 1).toString();
  86. // 要保存的数据
  87. List<CostCostingGroup> costCostingGroupArrayList = new LinkedList<>();
  88. // 判断最后科室代码的最后一个字符是否是-1
  89. if (!"-1".equals(endStatus)) {
  90. // 如果没有-1说明终结符
  91. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  92. incomeErrorMessage.setTotal(5);
  93. incomeErrorMessage.setErrMessage("科室代码末尾没有-1终结符");
  94. incomeErrorMessageList.add(incomeErrorMessage);
  95. // 文件上传
  96. String uploadFile = costIncomeGroupService.uploadFile(file, UserContext.getCurrentUser());
  97. // 上传记录保存
  98. if (StrUtil.isBlank(uploadFile)) {
  99. throw new CostException(500, "文件上传异常");
  100. }
  101. // 记录文件上传记录
  102. CostIncomeFile costIncomeFile = costIncomeFileService.saveCostIncomeFile(list, user, file, hospId, incomeErrorMessageList, uploadFile, fileType);
  103. return Result.build(500, "数据未成功导入", null);
  104. }
  105. // 检验收入数据
  106. checkCostData(list, incomeErrorMessageList, departmentMap, productMap, responsibilityMap, accountingMap, responsibilityDepMap, accountProMap, costCostingGroupArrayList, year, month);
  107. // 文件上传
  108. String uploadFile = costIncomeGroupService.uploadFile(file, UserContext.getCurrentUser());
  109. // 上传记录保存
  110. if (StrUtil.isBlank(uploadFile)) {
  111. throw new CostException(500, "文件上传异常");
  112. }
  113. // 记录文件上传记录
  114. CostIncomeFile costIncomeFile = costIncomeFileService.saveCostIncomeFile(list, user, file, hospId, incomeErrorMessageList, uploadFile, fileType);
  115. Long id = costIncomeFile.getId();
  116. costCostingGroupArrayList.forEach(i -> {
  117. // 设置文件Id
  118. i.setFileId(id);
  119. });
  120. if (CollectionUtils.isEmpty(incomeErrorMessageList)) {
  121. this.saveBatch(costCostingGroupArrayList);
  122. return Result.build(200, "数据导入成功", null);
  123. } else {
  124. return Result.build(500, "数据未成功导入", null);
  125. }
  126. }
  127. /**
  128. * 检验成本数据
  129. *
  130. * @param list
  131. * @param incomeErrorMessageList
  132. * @param departmentMap
  133. * @param productMap
  134. * @param responsibilityMap
  135. * @param accountingMap
  136. * @param responsibilityDepMap
  137. * @param accountProMap
  138. * @param costCostingGroupArrayList
  139. */
  140. private void checkCostData(List<List<Object>> list, List<IncomeErrorMessage> incomeErrorMessageList, Map<String, Department> departmentMap, Map<String, Product> productMap, Map<Long, Responsibility> responsibilityMap, Map<Long, Accounting> accountingMap, Map<Long, Long> responsibilityDepMap, Map<Long, Long> accountProMap, List<CostCostingGroup> costCostingGroupArrayList, Integer year, Integer month) {
  141. List<Object> departmentCodes = list.get(0);
  142. List<Object> departmentNames = list.get(1);
  143. //检验数据是否准确
  144. for (int i = 2; i < list.size(); i++) {
  145. List<Object> data = list.get(i);
  146. for (int j = 2; j < departmentCodes.size(); j++) {
  147. if (data.size() > j ) {
  148. if (Objects.isNull(data.get(j))){
  149. data.set(j, NumberConstant.ZERO);
  150. }else {
  151. data.set(j, Integer.parseInt(data.get(j).toString()));
  152. }
  153. }else if (data.size()<=departmentCodes.size()){
  154. data.add(NumberConstant.ZERO);
  155. }
  156. }
  157. // 检验成本项目是否正确
  158. CostCostingGroup costCostingGroupRequest = new CostCostingGroup();
  159. String productCode = data.get(0).toString();
  160. String productName = data.get(1).toString();
  161. Product product = productMap.get(productCode + productName);
  162. if (Objects.nonNull(product)) {
  163. Long id = product.getId();
  164. Long accountTingId = accountProMap.get(id);
  165. if (Objects.nonNull(accountTingId)) {
  166. Accounting accounting = accountingMap.get(accountTingId);
  167. if (Objects.nonNull(accounting)) {
  168. costCostingGroupRequest.setProductCode(productCode);
  169. costCostingGroupRequest.setProductName(productName);
  170. costCostingGroupRequest.setAccountCode(accounting.getAccountingCode());
  171. costCostingGroupRequest.setAccountName(accounting.getAccountingName());
  172. } else {
  173. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  174. incomeErrorMessage.setTotal(1);
  175. incomeErrorMessage.setErrMessage("成本代码" + productCode + " 成本名称" + productName + " 不存在对应的会计科目不存在");
  176. incomeErrorMessageList.add(incomeErrorMessage);
  177. }
  178. } else {
  179. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  180. incomeErrorMessage.setTotal(1);
  181. incomeErrorMessage.setErrMessage("成本代码" + productCode + " 成本名称" + productName + " 不存在对应的会计科目不存在");
  182. incomeErrorMessageList.add(incomeErrorMessage);
  183. }
  184. } else {
  185. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  186. incomeErrorMessage.setTotal(1);
  187. incomeErrorMessage.setErrMessage("成本代码" + productCode + " 成本名称" + productName + "不存在");
  188. incomeErrorMessageList.add(incomeErrorMessage);
  189. }
  190. // 0表示全为0 1表示不全为0
  191. Integer emptyStatus = 0;
  192. for (int j = 2; j < data.size()-1 ; j++) {
  193. int parseInt = Integer.parseInt(data.get(j).toString());
  194. if (!NumberConstant.ZERO.equals(parseInt)) {
  195. emptyStatus = 1;
  196. break;
  197. }
  198. }
  199. Integer combined = Integer.parseInt(data.get(data.size() - 1).toString());
  200. if (NumberConstant.ZERO.equals(emptyStatus) && NumberConstant.ZERO.equals(combined)) {
  201. // 全为0
  202. continue;
  203. } else if (!NumberConstant.ZERO.equals(combined) && NumberConstant.ZERO.equals(emptyStatus)) {
  204. // 这条数据是保存到其他责任中心的
  205. CostCostingGroup costCostingGroup = costCostingGroupRequest;
  206. // TODO 设置其他责任中心
  207. costCostingGroup.setResponsibilityCode("其他责任中心的Code");
  208. costCostingGroup.setResponsibilityName("其他责任中心的Name");
  209. costCostingGroup.setAmount(BigDecimal.valueOf(Double.parseDouble(combined.toString())));
  210. costCostingGroup.setHospId(UserContext.getHospId());
  211. costCostingGroup.setCreateTime(System.currentTimeMillis());
  212. costCostingGroup.setDateYear(year);
  213. costCostingGroup.setDateMonth(month);
  214. costCostingGroupArrayList.add(costCostingGroup);
  215. } else {
  216. for (int j = 2; j < data.size() - 1; j++) {
  217. CostCostingGroup costCostingGroup = costCostingGroupRequest;
  218. // 检验科室信息是否准确
  219. String departmentCode = departmentCodes.get(j).toString();
  220. String departmentName = departmentNames.get(j).toString();
  221. Department department = departmentMap.get(departmentCode + departmentName);
  222. if (Objects.nonNull(department)) {
  223. // 检测责任中心是否存在
  224. Long id = department.getId();
  225. Long responsibilityId = responsibilityDepMap.get(id);
  226. if (Objects.nonNull(responsibilityId)) {
  227. Responsibility responsibility = responsibilityMap.get(responsibilityId);
  228. if (Objects.nonNull(responsibility)) {
  229. costCostingGroup.setDepartmentCode(departmentCode);
  230. costCostingGroup.setDepartmentName(departmentName);
  231. costCostingGroup.setResponsibilityCode(responsibility.getResponsibilityCode());
  232. costCostingGroup.setResponsibilityName(responsibility.getResponsibilityName());
  233. } else {
  234. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  235. incomeErrorMessage.setTotal(j);
  236. incomeErrorMessage.setErrMessage("第" + j + "列科室信息对应的责任中心不存在");
  237. incomeErrorMessageList.add(incomeErrorMessage);
  238. }
  239. } else {
  240. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  241. incomeErrorMessage.setTotal(j);
  242. incomeErrorMessage.setErrMessage("第" + j + "列科室信息不存在对应的责任中心");
  243. incomeErrorMessageList.add(incomeErrorMessage);
  244. }
  245. } else {
  246. IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage();
  247. incomeErrorMessage.setTotal(j);
  248. incomeErrorMessage.setErrMessage("第" + j + "列科室信息不存在");
  249. incomeErrorMessageList.add(incomeErrorMessage);
  250. }
  251. costCostingGroup.setAmount(BigDecimal.valueOf(Double.parseDouble((Objects.isNull(data.get(j)) || "0".equals(data.get(j).toString())) ? "0.00" : data.get(j).toString())));
  252. costCostingGroup.setHospId(UserContext.getHospId());
  253. costCostingGroup.setCreateTime(System.currentTimeMillis());
  254. costCostingGroup.setDateYear(year);
  255. costCostingGroup.setDateMonth(month);
  256. costCostingGroupArrayList.add(costCostingGroup);
  257. }
  258. }
  259. }
  260. }
  261. }