CostCostingGroupServiceImpl.java 17 KB

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