CostCostingGroupServiceImpl.java 16 KB

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