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.CostShareParamGroupMapper; import com.imed.costaccount.model.*; import com.imed.costaccount.model.vo.IncomeErrorMessage; import com.imed.costaccount.service.CostIncomeFileService; import com.imed.costaccount.service.CostShareParamGroupService; import com.imed.costaccount.service.CostShareParamService; 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.stream.Collectors; import static com.imed.costaccount.service.impl.CostCostingGroupServiceImpl.isNumeric; @Service("costShareParamGroupService") public class CostShareParamGroupServiceImpl extends ServiceImpl implements CostShareParamGroupService { private final CostIncomeGroupServiceImpl costIncomeGroupService; private final CostShareParamService costShareParamService; private final CostIncomeFileService costIncomeFileService; public CostShareParamGroupServiceImpl(CostIncomeGroupServiceImpl costIncomeGroupService, CostShareParamService costShareParamService, CostIncomeFileService costIncomeFileService) { this.costIncomeGroupService = costIncomeGroupService; this.costShareParamService = costShareParamService; this.costIncomeFileService = costIncomeFileService; } /** * 成本分摊参数导入 * * @param list * @param user * @param file * @param dateTime * @param fileType * @return */ @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public Result importShareParamGroup(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(CostShareParamGroup::getHospId, hospId) .eq(CostShareParamGroup::getDateYear, year).eq(CostShareParamGroup::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 responsibilityMap = costIncomeGroupService.getResponsibilityIdResponsibilityMap(hospId); List responsibilityDepartmentList = costIncomeGroupService.getResponsibilityDepartments(hospId); if (CollectionUtils.isEmpty(responsibilityDepartmentList)) { throw new CostException(500, "没有科室责任中心对照数据"); } Map responsibilityDepMap = costIncomeGroupService.getDepartmentIdResponsibilityIdMap(responsibilityDepartmentList); Map shareParamMap = costShareParamService.list(new QueryWrapper().lambda().eq(CostShareParam::getHospId, hospId)).stream().collect(Collectors.toMap(k -> k.getShareParamCode() + k.getShareParamName(), synOe -> synOe)); // 要保存的数据 List costShareParamGroupList = new LinkedList<>(); List departmentCodes = list.get(0); List departmentNames = list.get(1); //检验数据是否准确 list包含了科室Code行与Name行 所以要从list的第三行开始 checkShareParamGroupData(list, year, month, incomeErrorMessageList, departmentMap, responsibilityMap, responsibilityDepMap, shareParamMap, costShareParamGroupList, departmentCodes, departmentNames); // 文件上传 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(); costShareParamGroupList.forEach(i -> { // 设置文件Id i.setFileId(id); }); if (CollectionUtils.isEmpty(incomeErrorMessageList)) { this.saveBatch(costShareParamGroupList); return Result.build(200, "数据导入成功", null); } else { return Result.build(500, "数据未成功导入", null); } } private void checkShareParamGroupData(List> list, int year, int month, List incomeErrorMessageList, Map departmentMap, Map responsibilityMap, Map responsibilityDepMap, Map shareParamMap, List costShareParamGroupList, List departmentCodes, List departmentNames) { for (int i = 2; i < list.size(); i++) { int row = i + 2; List data = list.get(i); // 检验成本分摊参数是否正确 CostShareParamGroup costShareParamGroupRequest = new CostShareParamGroup(); String shareParamCode = data.get(0).toString(); String shareParamName = data.get(1).toString(); CostShareParam costShareParam = shareParamMap.get(shareParamCode + shareParamName); if (Objects.nonNull(costShareParam)) { costShareParamGroupRequest.setShareParamCode(shareParamCode); costShareParamGroupRequest.setShareParamName(shareParamName); } else { IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage(); incomeErrorMessage.setTotal(1); incomeErrorMessage.setErrMessage("成本分摊代码:" + shareParamCode + " 名称" + shareParamName + "不存在"); incomeErrorMessageList.add(incomeErrorMessage); } for (int j = 2; j < departmentCodes.size(); j++) { if (data.size() > j) { if (Objects.isNull(data.get(j))) { data.set(j, NumberConstant.ZERO); } else if (isNumeric(data.get(j).toString())) { data.set(j, Double.parseDouble(data.get(j).toString())); } else { IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage(); incomeErrorMessage.setTotal(row); incomeErrorMessage.setErrMessage("第" + row + "行 第" + j + "列数据不符合规范"); incomeErrorMessageList.add(incomeErrorMessage); } } else { data.add(NumberConstant.ZERO); } } if (CollectionUtils.isEmpty(incomeErrorMessageList)) { // 检验数据是否全为0 Integer zeroStatus = 0; for (int j = 2; j < data.size(); j++) { if (!NumberConstant.ZERO.equals(data.get(j))) { zeroStatus = 1; break; } } if (NumberConstant.ONE.equals(zeroStatus)) { for (int j = 2; j < data.size(); j++) { CostShareParamGroup costShareParamGroup = BeanUtil.convertObj(costShareParamGroupRequest, CostShareParamGroup.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)) { costShareParamGroup.setResponsibilityCode(responsibility.getResponsibilityCode()); costShareParamGroup.setResponsibilityName(responsibility.getResponsibilityName()); } 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); } costShareParamGroup.setAmount(BigDecimal.valueOf(Double.parseDouble(("0".equals(data.get(j).toString()) || StrUtil.isBlank(data.get(j).toString())) ? "0.00" : data.get(j).toString()))); costShareParamGroup.setHospId(UserContext.getHospId()); costShareParamGroup.setCreateTime(System.currentTimeMillis()); costShareParamGroup.setDateYear(year); costShareParamGroup.setDateMonth(month); costShareParamGroupList.add(costShareParamGroup); } } } } } }