package com.imed.costaccount.service.impl; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; 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.BeanUtil; import com.imed.costaccount.common.util.DateUtils; import com.imed.costaccount.common.util.Result; import com.imed.costaccount.common.util.UserContext; 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 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.*; import java.util.regex.Matcher; import java.util.regex.Pattern; @Service("costCostingGroupService") @Slf4j public class CostCostingGroupServiceImpl extends ServiceImpl implements CostCostingGroupService { private final CostIncomeGroupServiceImpl costIncomeGroupService; private final AccountingProductService accountingProductService; private final CostIncomeFileService costIncomeFileService; public CostCostingGroupServiceImpl(CostIncomeGroupServiceImpl costIncomeGroupService, AccountingProductService accountingProductService, CostIncomeFileService costIncomeFileService) { this.costIncomeGroupService = costIncomeGroupService; this.accountingProductService = accountingProductService; this.costIncomeFileService = costIncomeFileService; } /** * 批量导入成本数据 * * @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); return Result.build(500, "数据未成功导入", null); } // 检验数据的合理性 Pattern pattern = Pattern.compile("[0-9]+(.[0-9]+)?"); Matcher isNum = pattern.matcher("str"); // 检验成本数据 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); 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(500, "数据未成功导入", null); } } public static boolean isNumeric(String str){ Pattern pattern = Pattern.compile("[0-9]+(.[0-9]+)?"); Matcher isNum = pattern.matcher(str); if( !isNum.matches() ){ return false; } return true; } /** * 检验成本数据 * * @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++) { if (data.size() > j ) { if (Objects.isNull(data.get(j))){ data.set(j, NumberConstant.ZERO); }else { data.set(j, Integer.parseInt(data.get(j).toString())); } }else { data.add(NumberConstant.ZERO); } } // 检验输入的数字是否合法 for (int j=2;j