package com.imed.costaccount.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.druid.util.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.imed.costaccount.common.exception.CostException; import com.imed.costaccount.common.util.*; import com.imed.costaccount.constants.NumberConstant; import com.imed.costaccount.enums.DateStyleEnum; import com.imed.costaccount.mapper.CostCostingGroupMapper; import com.imed.costaccount.model.*; import com.imed.costaccount.model.vo.IncomeErrorMessage; import com.imed.costaccount.service.AccountingProductService; import com.imed.costaccount.service.CostCostingGroupService; import com.imed.costaccount.service.CostIncomeFileService; import com.imed.costaccount.service.ResponsibilityService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import org.springframework.web.multipart.MultipartFile; import java.math.BigDecimal; import java.util.*; @Service("costCostingGroupService") @Slf4j public class CostCostingGroupServiceImpl extends ServiceImpl implements CostCostingGroupService { private final CostIncomeGroupServiceImpl costIncomeGroupService; private final AccountingProductService accountingProductService; private final CostIncomeFileService costIncomeFileService; private final ResponsibilityService responsibilityService; public CostCostingGroupServiceImpl(CostIncomeGroupServiceImpl costIncomeGroupService, AccountingProductService accountingProductService, CostIncomeFileService costIncomeFileService, ResponsibilityService responsibilityService) { this.costIncomeGroupService = costIncomeGroupService; this.accountingProductService = accountingProductService; this.costIncomeFileService = costIncomeFileService; this.responsibilityService = responsibilityService; } /** * 批量导入成本数据 * * @param list * @param user * @param file * @param dateTime * @param fileType * @return */ @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public Result importCostingGroup(List> list, User user, MultipartFile file, String dateTime, Integer fileType) { // 先检验当前年月是否存在数据 int year = 0; int month = 0; Date date = DateUtils.StringToDate(dateTime, DateStyleEnum.YYYY_MM); if (StrUtil.isNotBlank(dateTime)) { year = DateUtil.year(date); month = DateUtil.month(date) + 1; } Long hospId = user.getHospId(); List groups = this.list(new QueryWrapper().lambda().eq(CostCostingGroup::getHospId, hospId) .eq(CostCostingGroup::getDateYear, year).eq(CostCostingGroup::getDateMonth, month)); if (!CollectionUtils.isEmpty(groups)) { throw new CostException(500, year + "年" + month + "月数据已存在"); } for (int i = list.size() - 1; i >= 0; i--) { if (i == NumberConstant.ZERO || i == NumberConstant.ONE || i == NumberConstant.TWO || i == NumberConstant.THREE) { list.remove(list.get(i)); } } List incomeErrorMessageList = new ArrayList<>(); //获取所有的科室 成本项目 责任中心 会计科目 Map departmentMap = costIncomeGroupService.getDepartmentByCodeNameMap(hospId); Map productMap = costIncomeGroupService.getProductByCodeNameMap(hospId); Map responsibilityMap = costIncomeGroupService.getResponsibilityIdResponsibilityMap(hospId); Map accountingMap = costIncomeGroupService.getAccountIdAccountingMap(hospId); List responsibilityDepartmentList = costIncomeGroupService.getResponsibilityDepartments(hospId); if (CollectionUtils.isEmpty(responsibilityDepartmentList)) { throw new CostException(500, "没有科室责任中心对照数据"); } List accountingProductList = accountingProductService.list(new QueryWrapper().lambda().eq(AccountingProduct::getHospId, hospId)); if (CollectionUtils.isEmpty(accountingProductList)) { throw new CostException(500, "没有成本会计对照数据"); } Map responsibilityDepMap = costIncomeGroupService.getDepartmentIdResponsibilityIdMap(responsibilityDepartmentList); Map accountProMap = costIncomeGroupService.getProductIdAccountIdMap(accountingProductList); String endStatus = list.get(0).get(list.get(0).size() - 1).toString(); // 要保存的数据 List costCostingGroupArrayList = new LinkedList<>(); // 判断最后科室代码的最后一个字符是否是-1 if (!"-1".equals(endStatus)) { // 如果没有-1说明终结符 IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage(); incomeErrorMessage.setTotal(5); incomeErrorMessage.setErrMessage("科室代码末尾没有-1终结符"); incomeErrorMessageList.add(incomeErrorMessage); // 文件上传 String uploadFile = costIncomeGroupService.uploadFile(file, UserContext.getCurrentUser()); // 上传记录保存 if (StrUtil.isBlank(uploadFile)) { throw new CostException(500, "文件上传异常"); } // 记录文件上传记录 CostIncomeFile costIncomeFile = costIncomeFileService.saveCostIncomeFile(list, user, file, hospId, incomeErrorMessageList, uploadFile, fileType,year,month); return Result.build(500, "数据未成功导入", null); } // 检验数据的合理性 // 检验成本数据 checkCostData(list, incomeErrorMessageList, departmentMap, productMap, responsibilityMap, accountingMap, responsibilityDepMap, accountProMap, costCostingGroupArrayList, year, month); // 文件上传 String uploadFile = costIncomeGroupService.uploadFile(file, UserContext.getCurrentUser()); // 上传记录保存 if (StrUtil.isBlank(uploadFile)) { throw new CostException(500, "文件上传异常"); } // 记录文件上传记录 CostIncomeFile costIncomeFile = costIncomeFileService.saveCostIncomeFile(list, user, file, hospId, incomeErrorMessageList, uploadFile, fileType,year,month); Long id = costIncomeFile.getId(); costCostingGroupArrayList.forEach(i -> { // 设置文件Id i.setFileId(id); }); if (CollectionUtils.isEmpty(incomeErrorMessageList)) { this.saveBatch(costCostingGroupArrayList); return Result.build(200, "数据导入成功", null); } else { return Result.build(200, "数据未成功导入", null); } } /** * 检验成本数据 * * @param list * @param incomeErrorMessageList * @param departmentMap * @param productMap * @param responsibilityMap * @param accountingMap * @param responsibilityDepMap * @param accountProMap * @param costCostingGroupArrayList */ private void checkCostData(List> list, List incomeErrorMessageList, Map departmentMap, Map productMap, Map responsibilityMap, Map accountingMap, Map responsibilityDepMap, Map accountProMap, List costCostingGroupArrayList, Integer year, Integer month) { List departmentCodes = list.get(0); List departmentNames = list.get(1); //检验数据是否准确 for (int i = 2; i < list.size(); i++) { int row=i+5; List data = list.get(i); for (int j = 2; j < departmentCodes.size(); j++) { int column=j+1; if (data.size() > j ) { if (Objects.isNull(data.get(j))){ data.set(j, NumberConstant.ZERO); }else if ( data.get(j).toString().contains("-") || !StringUtils.isNumber(data.get(j).toString())){ IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage(); incomeErrorMessage.setTotal(row); incomeErrorMessage.setErrMessage("第"+row+"行 第"+column+"列数据不符合规范"); incomeErrorMessageList.add(incomeErrorMessage); }else { data.set(j, Double.parseDouble(data.get(j).toString())); } }else { data.add(NumberConstant.ZERO); } } if (CollectionUtils.isEmpty(incomeErrorMessageList)){ incomeErrorMessageList=new ArrayList<>(); int emptyStatus = 0; for (int j = 2; j < data.size()-1 ; j++) { BigDecimal parseInt = new BigDecimal (data.get(j).toString()); if (!BigDecimal.ZERO.equals(parseInt)) { emptyStatus = 1; break; } } // 检验成本项目是否正确 CostCostingGroup costCostingGroupRequest = new CostCostingGroup(); String productCode = data.get(0).toString(); String productName = data.get(1).toString(); Product product = productMap.get(productCode + productName); AfterCostGroup afterCostGroupRequest = new AfterCostGroup(); if (Objects.nonNull(product)) { Long id = product.getId(); Long accountTingId = accountProMap.get(id); if (Objects.nonNull(accountTingId)) { Accounting accounting = accountingMap.get(accountTingId); if (Objects.nonNull(accounting)) { costCostingGroupRequest.setProductCode(productCode); costCostingGroupRequest.setProductName(productName); costCostingGroupRequest.setAccountCode(accounting.getAccountingCode()); costCostingGroupRequest.setAccountName(accounting.getAccountingName()); afterCostGroupRequest.setProductCode(productCode); afterCostGroupRequest.setProductName(productName); afterCostGroupRequest.setAccountCode(accounting.getAccountingCode()); afterCostGroupRequest.setAccountName(accounting.getAccountingName()); } else { IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage(); incomeErrorMessage.setTotal(1); incomeErrorMessage.setErrMessage("成本代码" + productCode + " 成本名称" + productName + " 不存在对应的会计科目不存在"); incomeErrorMessageList.add(incomeErrorMessage); } } else { IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage(); incomeErrorMessage.setTotal(1); incomeErrorMessage.setErrMessage("成本代码" + productCode + " 成本名称" + productName + " 不存在对应的会计科目不存在"); incomeErrorMessageList.add(incomeErrorMessage); } } else { IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage(); incomeErrorMessage.setTotal(1); incomeErrorMessage.setErrMessage("成本代码" + productCode + " 成本名称" + productName + "不存在"); incomeErrorMessageList.add(incomeErrorMessage); } // 0表示全为0 1表示不全为0 BigDecimal combined = new BigDecimal (data.get(data.size() - 1).toString()); if (!BigDecimal.ZERO.equals(combined) && NumberConstant.ZERO.equals(emptyStatus)) { // 这条数据是保存到其他责任中心的 CostCostingGroup costCostingGroup = costCostingGroupRequest; AfterCostGroup afterCostGroup = BeanUtil.convertObj(afterCostGroupRequest,AfterCostGroup.class); // TODO 设置其他责任中心 Responsibility responsibilityServiceOne = responsibilityService.getOne(new QueryWrapper().lambda().eq(Responsibility::getHospId, UserContext.getHospId()).eq(Responsibility::getIsDefault, NumberConstant.ONE)); if (Objects.nonNull(responsibilityServiceOne)){ costCostingGroup.setResponsibilityCode(responsibilityServiceOne.getResponsibilityCode()); costCostingGroup.setResponsibilityName(responsibilityServiceOne.getResponsibilityName()); // 设置统计数据 afterCostGroup.setOtherResponsibilityCode(responsibilityServiceOne.getResponsibilityCode()); afterCostGroup.setOtherResponsibilityName(responsibilityServiceOne.getResponsibilityName()); } costCostingGroup.setProductCode(costCostingGroupRequest.getProductCode()); costCostingGroup.setProductName(costCostingGroupRequest.getProductName()); costCostingGroup.setAccountCode(costCostingGroupRequest.getAccountCode()); costCostingGroup.setAccountName(costCostingGroupRequest.getAccountName()); costCostingGroup.setAmount(combined); costCostingGroup.setHospId(UserContext.getHospId()); costCostingGroup.setCreateTime(System.currentTimeMillis()); costCostingGroup.setDateYear(year); costCostingGroup.setDateMonth(month); afterCostGroup.setAmount(combined); String s = JsonUtil.toJSONString(afterCostGroup); costCostingGroup.setAfterCostGroup(s); costCostingGroupArrayList.add(costCostingGroup); } else { for (int j = 2; j < data.size() - 1; j++) { AfterCostGroup afterCostGroup = BeanUtil.convertObj(afterCostGroupRequest,AfterCostGroup.class); CostCostingGroup costCostingGroup = BeanUtil.convertObj(costCostingGroupRequest,CostCostingGroup.class); // 检验科室信息是否准确 String departmentCode = departmentCodes.get(j).toString(); String departmentName = departmentNames.get(j).toString(); Department department = departmentMap.get(departmentCode + departmentName); if (Objects.nonNull(department)) { // 检测责任中心是否存在 Long id = department.getId(); Long responsibilityId = responsibilityDepMap.get(id); if (Objects.nonNull(responsibilityId)) { Responsibility responsibility = responsibilityMap.get(responsibilityId); if (Objects.nonNull(responsibility)) { costCostingGroup.setDepartmentCode(departmentCode); costCostingGroup.setDepartmentName(departmentName); costCostingGroup.setResponsibilityCode(responsibility.getResponsibilityCode()); costCostingGroup.setResponsibilityName(responsibility.getResponsibilityName()); afterCostGroup.setResponsibilityCode(responsibility.getResponsibilityCode()); afterCostGroup.setResponsibilityName(responsibility.getResponsibilityName()); afterCostGroup.setDepartmentCode(departmentCode); afterCostGroup.setDepartmentName(departmentName); } else { IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage(); incomeErrorMessage.setTotal(j); incomeErrorMessage.setErrMessage("第" + j + "列科室信息对应的责任中心不存在"); incomeErrorMessageList.add(incomeErrorMessage); } } else { IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage(); incomeErrorMessage.setTotal(j); incomeErrorMessage.setErrMessage("第" + j + "列科室信息不存在对应的责任中心"); incomeErrorMessageList.add(incomeErrorMessage); } } else { IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage(); incomeErrorMessage.setTotal(j); incomeErrorMessage.setErrMessage("第" + j + "列科室信息不存在"); incomeErrorMessageList.add(incomeErrorMessage); } costCostingGroup.setAmount(new BigDecimal((Objects.isNull(data.get(j)) || "0".equals(data.get(j).toString())) ? "0.00" : data.get(j).toString())); costCostingGroup.setHospId(UserContext.getHospId()); costCostingGroup.setCreateTime(System.currentTimeMillis()); costCostingGroup.setDateYear(year); costCostingGroup.setDateMonth(month); afterCostGroup.setAmount(new BigDecimal((Objects.isNull(data.get(j)) || "0".equals(data.get(j).toString())) ? "0.00" : data.get(j).toString())); String s = JsonUtil.toJSONString(afterCostGroup); costCostingGroup.setAfterCostGroup(s); costCostingGroupArrayList.add(costCostingGroup); } } } } } }