package com.imed.costaccount.service.impl; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.ErrorCodeEnum; import com.imed.costaccount.mapper.CostIncomeGroupMapper; import com.imed.costaccount.model.*; import com.imed.costaccount.model.vo.CostIncomeGroupAllAmountVO; import com.imed.costaccount.model.vo.CostIncomeGroupBeforeVO; import com.imed.costaccount.model.vo.IncomeErrorMessage; import com.imed.costaccount.service.*; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; 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.io.File; import java.io.IOException; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; @Slf4j @Service("costIncomeGroupService") public class CostIncomeGroupServiceImpl extends ServiceImpl implements CostIncomeGroupService { @Value("${file.serverPath}") private String fileTempPath; @Value("${file.serverUrl}") private String FILE_PATH; private final DepartmentService departmentService; private final ResponsibilityService responsibilityService; private final ProductService productService; private final AccountingService accountingService; private final ResponsibilityDepartmentService responsibilityDepartmentService; private final AccountingProductService accountingProductService; public CostIncomeGroupServiceImpl(DepartmentService departmentService, ResponsibilityService responsibilityService, ProductService productService, AccountingService accountingService, ResponsibilityDepartmentService responsibilityDepartmentService, AccountingProductService accountingProductService) { this.departmentService = departmentService; this.responsibilityService = responsibilityService; this.productService = productService; this.accountingService = accountingService; this.responsibilityDepartmentService = responsibilityDepartmentService; this.accountingProductService = accountingProductService; } /** * 分页查询收入归集前的数据 * * @param current 当前页 * @param pageSize 当前页大小 * @param dateTime 年月 * @param responsibilityCode 责任中心代码 * @param accountCode 会计科目的Code * @param hospId 医院Id * @return */ @Override public PageUtils queryList(Integer current, Integer pageSize, String dateTime, String responsibilityCode, String accountCode, Long hospId) { int year = 0; int month = 0; if (StrUtil.isNotBlank(dateTime)) { year = DateUtils.getYear(dateTime); month = DateUtils.getMonth(dateTime); } Page costIncomeGroupPage = new Page<>(current, pageSize); Page pages = this.page(costIncomeGroupPage, new QueryWrapper().lambda() .eq(Objects.nonNull(hospId), CostIncomeGroup::getHospId, hospId) .eq(!NumberConstant.ZERO.equals(year), CostIncomeGroup::getDateYear, year) .eq(!NumberConstant.ONE.equals(month), CostIncomeGroup::getDateMonth, month) .and(StrUtil.isNotBlank(responsibilityCode), i -> i.like(CostIncomeGroup::getOpenResponsibilityCode, responsibilityCode) .or().like(CostIncomeGroup::getStartResponsibilityCode, responsibilityCode)) .like(StrUtil.isNotBlank(accountCode), CostIncomeGroup::getAccountCode, accountCode)); List records = pages.getRecords(); List costIncomeGroupBeforeVOList = BeanUtil.convertList(records, CostIncomeGroupBeforeVO.class); // 查询所有的责任中心 科室 会计科目 成本项目的数据 处理名字 // TODO 修改直接获取名字 setCodeName(hospId, costIncomeGroupBeforeVOList); // 进行金额合并 List costIncomeGroupAllAmountVoS = baseMapper.countMoney(costIncomeGroupBeforeVOList); // 对,的金额进行合并 costIncomeGroupAllAmountVoS.forEach(i -> { String allMoney = i.getAllMoney(); if (allMoney.contains(StrUtil.COMMA)) { // 存在,在进行求和 long sum; List list = Arrays.stream(allMoney.split(StrUtil.COMMA)).map(Long::valueOf).collect(Collectors.toList()); sum = list.stream().mapToLong(m -> m).sum(); i.setAmount(BigDecimal.valueOf(sum)); } }); PageUtils pageUtils = new PageUtils(pages); pageUtils.setList(costIncomeGroupAllAmountVoS); return pageUtils; } /** * 批量导入收入数据 * * @param list 输入的文件 * @param hospId 医院Id * @param file * @return */ @Override @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public Result importIncomeGroup(List> list, Long hospId, MultipartFile file) { // 移除前几行的抬头内容 list的大小对应的就是行数的大小 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)); } } log.info("读取的数据为:{}", list); List costIncomeGroupList = new ArrayList<>(); List incomeErrorMessageList = new ArrayList<>(); //获取所有的科室 成本项目 责任中心 会计科目 Map departmentMap = departmentService.list(new QueryWrapper().lambda().eq(Department::getHospId, hospId)).stream().collect(Collectors.toMap(k -> k.getDepartmentCode() + k.getDepartmentName(), synOe -> synOe)); Map productMap = productService.list(new QueryWrapper().lambda().eq(Product::getHospId, hospId)).stream().collect(Collectors.toMap(k -> k.getProductCode() + k.getProductName(), synOe -> synOe)); Map responsibilityMap = responsibilityService.list(new QueryWrapper().lambda().eq(Responsibility::getHospId, hospId)).stream().collect(Collectors.toMap(Responsibility::getId, synOe -> synOe)); Map accountingMap = accountingService.list(new QueryWrapper().lambda().eq(Accounting::getHospId, hospId)).stream().collect(Collectors.toMap(Accounting::getId, synOe -> synOe)); List responsibilityDepartmentList = responsibilityDepartmentService.list(new QueryWrapper().lambda() .eq(ResponsibilityDepartment::getHospId, 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 = responsibilityDepartmentList.stream().collect(Collectors.toMap(ResponsibilityDepartment::getDepartmentId, ResponsibilityDepartment::getResponsibilityId)); Map accountProMap = accountingProductList.stream().collect(Collectors.toMap(AccountingProduct::getProductId, AccountingProduct::getAccountingId)); List costIncomeGroupArrayList = new ArrayList<>(); // 检验数据 checkImportData(list, incomeErrorMessageList, costIncomeGroupArrayList, departmentMap, productMap, responsibilityMap, accountingMap, responsibilityDepMap, accountProMap); if (!CollectionUtils.isEmpty(incomeErrorMessageList)) { // 说明存在错误数据 // TODO 不把数据保存在收入归集表里面 直将信息保存在提交记录里面 } else { // 实现数据的存储 for (int i = 0; i < list.size(); i++) { CostIncomeGroup costIncomeGroup = new CostIncomeGroup(); List data = list.get(i); // 成本项目的代码和名称 String productCode = data.get(0).toString(); // 开单科室 执行科室的代码和名称 String openDepartmentCode = data.get(3).toString(); String startDepartmentCode = data.get(5).toString(); BigDecimal beforeMoney = (BigDecimal) data.get(15); } } String uploadFile = uploadFile(file, UserContext.getCurrentUser()); if (StrUtil.isNotBlank(uploadFile)) { // 文件上传成功 将文件记录保存 } return Result.ok(); } /** * 检验数据 * * @param list 表单数据 * @param incomeErrorMessageList 存储错误信息的集合 * @param costIncomeGroupArrayList * @param departmentMap 科室Map * @param productMap 成本项目map * @param responsibilityMap 责任中心Map * @param accountingMap 会计科目Map * @param responsibilityDepMap 责任中心科室对照Map * @param accountProMap 责任中心Map */ private void checkImportData(List> list, List incomeErrorMessageList, List costIncomeGroupArrayList, Map departmentMap, Map productMap, Map responsibilityMap, Map accountingMap, Map responsibilityDepMap, Map accountProMap) { for (int i = 0; i < list.size(); i++) { CostIncomeGroup costIncomeGroup = new CostIncomeGroup(); // 用来检验数据合理性的循环 IncomeErrorMessage incomeErrorMessage = new IncomeErrorMessage(); List data = list.get(i); log.info("用户输入的数据是{}", data); // 成本项目的代码和名称 String productCode = data.get(0).toString(); String productName = data.get(1).toString(); // 开单科室 执行科室的代码和名称 String openDepartmentName = data.get(2).toString(); String openDepartmentCode = data.get(3).toString(); String startDepartmentName = data.get(4).toString(); String startDepartmentCode = data.get(5).toString(); BigDecimal beforeMoney = (BigDecimal) data.get(15); boolean checkNull = Objects.isNull(beforeMoney); boolean checkOne = NumberConstant.ZERO.equals(Integer.parseInt(beforeMoney.toString())); if (!checkNull && !checkOne) { // 要求这一行的数据必须全部填写 for (int j = 0; j < NumberConstant.FIVE; j++) { if (Objects.isNull(data.get(j))) { incomeErrorMessage.setTotal(i); int row = i + 1; int column = j + 1; incomeErrorMessage.setErrMessage("第{" + row + "}行第{" + column + "}列数据为空"); incomeErrorMessageList.add(incomeErrorMessage); } } } // TODO 暂时不走循环 直接获取数据的处理 // 检验数据是否存在 Product product = productMap.get(productCode + productName); Department department = departmentMap.get(openDepartmentCode + openDepartmentName); Department department1 = departmentMap.get(startDepartmentCode + startDepartmentName); // if (!checkNull && !checkOne ){ // if (StrUtil.isNotBlank(productCode) && StrUtil.isNotBlank(productName)){ // if (Objects.isNull(product)) { // incomeErrorMessage.setTotal(i); // incomeErrorMessage.setErrMessage("代码:" + productCode + " 名称:" + productName + "成本项目不存在"); // incomeErrorMessageList.add(incomeErrorMessage); // } else { // // 检验对应的会计科目是否存在 // Long id = product.getId(); // Long accountId = accountProMap.get(id); // if (Objects.isNull(accountingMap.get(accountId))) { // incomeErrorMessage.setTotal(i); // incomeErrorMessage.setErrMessage("代码:" + productCode + " 名称:" + productName + "成本项目对应的会计科目不存在"); // incomeErrorMessageList.add(incomeErrorMessage); // } else { // costIncomeGroup.setProductCode(productCode); // costIncomeGroup.setProductName(productName); // costIncomeGroup.setAccountCode(accountingMap.get(accountId).getAccountingCode()); // costIncomeGroup.setAccountName(accountingMap.get(accountId).getAccountingName()); // } // } // } // } // 开单科室 if (Objects.isNull(department)) { incomeErrorMessage.setTotal(i); incomeErrorMessage.setErrMessage("代码:" + productCode + " 名称:" + productName + "开单科室不存在"); incomeErrorMessageList.add(incomeErrorMessage); } else { Long id = department.getId(); Long responsibilityId = responsibilityDepMap.get(id); if (Objects.isNull(responsibilityMap.get(responsibilityId))) { incomeErrorMessage.setTotal(i); incomeErrorMessage.setErrMessage("代码:" + openDepartmentCode + " 名称:" + openDepartmentName + "科室对应的责任中心不存在"); incomeErrorMessageList.add(incomeErrorMessage); } else { costIncomeGroup.setOpenDepartmentCode(openDepartmentCode); costIncomeGroup.setOpenResponsibilityCode(responsibilityMap.get(responsibilityId).getResponsibilityCode()); } } //执行科室 if (Objects.isNull(department1)) { incomeErrorMessage.setTotal(i); incomeErrorMessage.setErrMessage("代码:" + productCode + " 名称:" + productName + "执行科室不存在"); incomeErrorMessageList.add(incomeErrorMessage); } else { Long id = department1.getId(); Long responsibilityId = responsibilityDepMap.get(id); if (Objects.isNull(responsibilityMap.get(responsibilityId))) { incomeErrorMessage.setTotal(i); incomeErrorMessage.setErrMessage("代码:" + openDepartmentCode + " 名称:" + openDepartmentName + "科室对应的责任中心不存在"); incomeErrorMessageList.add(incomeErrorMessage); } else { costIncomeGroup.setStartDepartmentCode(startDepartmentCode); costIncomeGroup.setStartResponsibilityCode(responsibilityMap.get(responsibilityId).getResponsibilityCode()); } } costIncomeGroup.setAmount(beforeMoney); } } /** * 设置相关名称 * * @param hospId * @param costIncomeGroupBeforeVOList */ private void setCodeName(Long hospId, List costIncomeGroupBeforeVOList) { List responsibilityList = responsibilityService.list(new QueryWrapper().lambda().eq(Responsibility::getHospId, hospId)); Map responsibilityMap = responsibilityList.stream().collect(Collectors.toMap(Responsibility::getResponsibilityCode, Responsibility::getResponsibilityName)); List departmentList = departmentService.list(new QueryWrapper().lambda().eq(Department::getHospId, hospId)); Map departmentMap = departmentList.stream().collect(Collectors.toMap(Department::getDepartmentCode, Department::getDepartmentName)); List productList = productService.list(new QueryWrapper().lambda().eq(Product::getHospId, hospId)); Map productMap = productList.stream().collect(Collectors.toMap(Product::getProductCode, Product::getProductName)); List accountingList = accountingService.list(new QueryWrapper().lambda().eq(Accounting::getHospId, hospId)); Map accountMap = accountingList.stream().collect(Collectors.toMap(Accounting::getAccountingCode, Accounting::getAccountingName)); costIncomeGroupBeforeVOList.forEach(i -> { // 以为这里的数据导入的 在导入的时候进行数据校验 // 设置开单科室名称 执行科室名称 开单责任中心名称 执行责任中心名称 成本项目的名称 会计科目名称 i.setOpenDepartmentCodeName("[" + i.getOpenDepartmentCode() + "]" + departmentMap.get(i.getOpenDepartmentCode())); i.setOpenResponsibilityCodeName("[" + i.getOpenResponsibilityCode() + "]" + responsibilityMap.get(i.getOpenResponsibilityCode())); i.setStartDepartmentCodeName("[" + i.getStartDepartmentCode() + "]" + departmentMap.get(i.getStartDepartmentCode())); i.setStartResponsibilityCodeName("[" + i.getStartResponsibilityCode() + "]" + responsibilityMap.get(i.getStartResponsibilityCode())); i.setProductCodeName("[" + i.getProductCode() + "]" + productMap.get(i.getProductCode())); i.setAccountCodeName("[" + i.getAccountCode() + "]" + accountMap.get(i.getAccountCode())); }); } /** * 文件上传 */ public String uploadFile(MultipartFile file, User user) { Long hospId = user.getHospId(); String fileName = file.getOriginalFilename(); String localFilePath = fileTempPath + StrUtil.SLASH + hospId + StrUtil.SLASH; File tempFile = new File(localFilePath); if (!tempFile.exists()) { tempFile.mkdirs(); } localFilePath = localFilePath + fileName; try { file.transferTo(new File(localFilePath)); } catch (IOException e) { log.error("【文件上传至本地】失败,绝对路径:{}", e.getMessage()); throw new CostException(ErrorCodeEnum.FILE_UPLOAD_ERROR); } finally { } return FILE_PATH + hospId + StrUtil.SLASH + fileName; } }